集計表の外部結合
SQL文について勉強中ですが、集計のやり方が分からないためお教えください。
SQL SERVER2008r2
Management StudioでSQLを書いてます。
◎TM部門(店舗マスタ)
店舗CD
店舗名
◎TM店舗部門(店舗部門マスタ)
店舗部門CD
店舗部門名
◎TT売上伝票(売上伝票)
伝票番号
行
店舗CD
店舗部門CD
売上日
売上時間
商品CD
商品名
数量
税抜単価
税込単価
税抜金額
税込金額
消費税
伝票合計
上記テーブルがあり、日付を限定して集計したいのですが、うまくSQLが書けません。
【希望結果例】
集計期間:2014/04/20 ~ 2014/05/20
日付 | 店舗名 |店舗部門名 | 日別合計
2014/05/21 | 店舗A | 店舗部門A | sum(伝票合計)
2014/05/21 | 店舗A | 店舗部門B | sum(伝票合計)
2014/05/21 | 店舗A | 店舗部門C | sum(伝票合計)
2014/05/21 | 店舗B | 店舗部門D | sum(伝票合計)
2014/05/21 | 店舗B | 店舗部門E | sum(伝票合計)
2014/05/21 | 店舗B | 店舗部門F | sum(伝票合計)
~
SELECT
伝票日付,
店舗CD,
店舗部門CD,
SUM(伝票合計) AS 日別合計
FROM TT売上伝票
GROUP BY 伝票日付,店舗CD,店舗部門CD
HAVING 伝票日付 BETWEEN '2014-04-21' AND '2014-05-20' AND 店舗CD IN(1,2,3,4)
ORDER BY 伝票日付,店舗CD,店舗部門CD
上記の結果
日付 | 店舗CD |店舗部門CD | 日別合計
2014/05/21 | 店舗A | 店舗部門A | sum(伝票合計)
2014/05/21 | 店舗A | 店舗部門B | sum(伝票合計)
2014/05/21 | 店舗A | 店舗部門C | sum(伝票合計)
2014/05/21 | 店舗B | 店舗部門D | sum(伝票合計)
2014/05/21 | 店舗B | 店舗部門E | sum(伝票合計)
2014/05/21 | 店舗B | 店舗部門F | sum(伝票合計)
集計は全く問題ないのですが、ここからリレーションし、店舗名、店舗部門名を表示したいのですが、書き方が分かりません。
無知ながら、下記方法を試しました結果
SELECT
TT売上伝票.店舗CD,
TM店舗.店舗名,
TT売上伝票.店舗部門CD,
TM店舗部門.店舗部門名
FROM TT売上伝票
JOIN TM店舗
ON TM店舗.店舗CD=TT売上伝票.店舗CD
JOIN TM店舗部門
ON TM店舗部門.店舗部門CD=TT売上伝票.店舗部門CD
UNION ALL
SELECT
伝票日付,
店舗CD,
店舗部門CD,
SUM(伝票合計) AS 日別合計
FROM TT売上伝票
GROUP BY 伝票日付,店舗CD,店舗部門CD
HAVING 伝票日付 BETWEEN '2014-04-21' AND '2014-05-20' AND 店舗CD IN(1,2,3,4)
ORDER BY 伝票日付,店舗CD,店舗部門CD
エラーメッセージ
ステートメントが UNION、INTERSECT、EXCEPT のいずれかの演算子を含んでいるときは、選択リスト内に ORDER BY 項目が必要です。
無知ながら、UNION演算子でやる方法と、サブクリエを使う方法があるのではと思いますが、出来れば利点と欠点を含めてお教え頂けたら幸いです。
お礼
NotFound404様 何度も、回答頂きありがとうございます。 >Accessは元々個人向けのアプリなので大勢が一度に更新処理を行うことなど ほとんど考慮されていないので競合やデータの破損が起きやすいです。 それを避けるためには、相当作りこまないと信頼できるものになりません。 大変だよー、止めといた方が・・・。 そうなんです、ここが一番心配な所ではありますが、今の所私にはAccessしか手段が無いので、ある程度運用上の制限をかけて運用したいと考えてます。 ある程度使えると利便性を会社が考えてくれれば、業者さんへ発注したいと考えてます。 >でフロントエンドとバックエンドに分割してください http://office.microsoft.com/ja-jp/access-help/HA010240096.aspx 最終的にはデータは、SQLServerがあるので、そちらに以降しリンクテーブルで運用する予定です。 >ロック競合を回避する http://msdn.microsoft.com/ja-jp/library/cc376493.aspx (記事が古いですが役立つと思います) ある程度目鼻たたったら、次に考えなければいけない事だと思っていましたので、参考にさせて頂きます。 >社員テーブル これは、社内の別システム(SQLSERVER2008)があるので、リンクテーブル必要な項目だけクエリで抜き出してます。 >SID は何に使っているのだろう。 SIDはログイン時のシリアル値を、T_Loginテーブルに、部門ID・店舗ID・売上日・LoginIDと共に保存させ、SIDをフォーム間で引渡しし、他のカラムは、Dlookupで引っ張り、売上サマリテーブルや売上詳細テーブルに保存させてます。 Web系ならば、セッションを使うと思うのですが、AccessでのユニークIDの作り方が分からなかったので、今の仕様にしております。 >ログインフォームはリンクのようにフロントエンド側(ユーザー側)のファイルに作成して Forms!ログインフォーム!日付選択 などのように参照します。 なるほど、勉強になりました。 片っ端から、本を購入して猛勉強中ですが、基本的なスペックが低いせいか基本的な事を理解出来てません。 取りあえず、フォームにSIDを渡して回る方向で、ある程度希望通りに動かせそうですので、何とかなりそうです。 重ね重ねアドバイス頂きありがとうございました。