カテゴリー
コンピューター

【EC-CUBE 2.12】受注の各商品も出力して CSV ダウンロードを実現する方法♪

受注の各商品も CSV 出力する SQL 文

受注の CSV 出力には、商品名は出力されません。

なぜなら、EC-CUBE の受注 CSV ダウンロードは 1 受注を1 行に出力する仕様でございますもの。

もし、1 回の買物で、複数種類の商品を買った場合、これらの商品をどうやって CSV に出力すればよいかしら?商品すべてを 1 つのセルに書きだすようにすればよいかしら?

できそうですわね!では、それぞれの商品の値段、購入した個数も知りたくなったらどうかしら?ひとつのセルに押し込めるかしら?ムギュウムギュウ♪

素直にはできませんわね><。大変難しいですの!

考え方はいろいろございますけれども、1 行 に 1 商品で出力します。そして、各行にその受注の合計金額など他の情報も掲載します。そのような方法も採れますわ、悪く無いと思いますの。

複雑さが増してしまいますけれども、CSV でしたら エクセルを念頭においていると存じます。まだ現実的な範囲内ではないかしら?

そのようなわけで、これを実現する SQL 文を書いてみましたわ♪

次の SQL 文を EC-CUBE の管理者ページ、コンテンツ管理>CSV出力項目設定>高度な設定、に入力いたします。

なお、実際にフォームに入力するときは、1 行目の SELECT は入力しません。また、最後の 1 文の ; も入力しません。

SELECT
	dtb_order.order_id,
	dtb_order.customer_id,
	dtb_order.message,
	dtb_order.order_name01,
	dtb_order.order_name02,
	dtb_order.order_kana01,
	dtb_order.order_kana02,
	dtb_order.order_email,
	dtb_order.order_tel01,
	dtb_order.order_tel02,
	dtb_order.order_tel03,
	dtb_order.order_fax01,
	dtb_order.order_fax02,
	dtb_order.order_fax03,
	dtb_order.order_zip01,
	dtb_order.order_zip02,
	(SELECT mtb_pref.name FROM mtb_pref WHERE mtb_pref.id = dtb_order.order_pref),
	dtb_order.order_addr01,
	dtb_order.order_addr02,
	dtb_order.order_sex,
	dtb_order.order_birth,
	dtb_order.order_job,
	dtb_order_detail.product_name,
	dtb_order_detail.product_code,
	dtb_order_detail.classcategory_name1,
	dtb_order_detail.classcategory_name2,
	dtb_order_detail.price,
	dtb_order_detail.quantity,
	dtb_order.subtotal,
	dtb_order.discount,
	dtb_order.deliv_fee,
	dtb_order.charge,
	dtb_order.use_point,
	dtb_order.add_point,
	dtb_order.tax,
	dtb_order.total,
	dtb_order.payment_total,
	dtb_order.deliv_id,
	dtb_order.payment_method,
	dtb_order.note,
	dtb_order.status,
	dtb_order.create_date,
	dtb_order.update_date,
	dtb_order.commit_date,
	dtb_order.device_type_id,
	(SELECT count(*) FROM dtb_shipping WHERE dtb_shipping.order_id = dtb_order.order_id),
	(SELECT array_to_string(array(SELECT dtb_shipping.shipping_id FROM dtb_shipping WHERE dtb_shipping.order_id = dtb_order.order_id), ','))
FROM
	dtb_order
INNER JOIN
	dtb_order_detail
ON
	dtb_order.order_id = dtb_order_detail.order_id
WHERE
	del_flg = 0
;

INNER JOIN で内部結合しているだけですの♪

おわりに

今回は、先日のこの投稿の続きとなりますわ。

次のページが参考になりました。ありがとう存じます!特に、次の点が勉強になりましたの♪

  • 内部結合:テーブルから結合条件に一致するデータを取得する
  • 外部結合:結合条件に一致するデータに加えて、指定された一方のすべてのデータを取得する

WHERE句に通常の条件句指定を行った場合に結合条件との見分けが付きづらいため、JOIN句を利用した結合を勧めます。

外部結合は内部結合の結果に対し、結合する2つのテーブルのうち、一方のテーブルに含まれるデータをすべて取得します。

以上です。

コメントを残す