Access (一般機能)

Accessの一般機能に関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 7 Professional : Access 2013)
売上のない年月のデータを表示したい
投稿日時: 19/03/25 14:28:52
投稿者: hato

お世話になります。
商品の売上がない年月であっても、全ての商品分類の売上を表にしようと
SQLを作成しています。
LEFT JOINを使えばいいと思うのですが、うまくいきません。
どのようにしたらデータのない行も出力できるでしょうか?
どうぞよろしくお願いいたします。
 
●T商品分類
商品分類CD    商品分類名
A001        商品分類1
A002        商品分類2
A003        商品分類3
 
●Q_売上
年月    商品分類CD    本年売上    前年売上
201804    A001        1000        900
201805    A002        500        600
201805    A003        100        150
 
●出したい結果
年月    商品分類CD    本年売上    前年売上
201804    A001    1000    900
201804    A002    0    0
201804    A003    0    0
201805    A001    0    0
201805    A002    500    600
201805    A003    100    150
 
●作成中のSQL
SELECT
       B.年月
       ,A.商品分類CD
       ,B.本年売上
       ,B.前年売上
 FROM
       T商品分類 AS A
       LEFT JOIN Q_売上 AS B
       ON A.商品分類CD=B.商品分類CD
 

回答
投稿日時: 19/03/25 20:14:29
投稿者: よろずや

SELECT   C.年月
       , C.商品分類CD
       , D.本年売上
       , D.前年売上
FROM (SELECT A.年月, B.商品分類CD
      FROM Q_売上 AS A, T商品分類 AS B
      GROUP BY A.年月, B.商品分類CD
     ) AS C
     LEFT JOIN Q_売上 AS D
     ON  C.年月 = D.年月
     AND C.商品分類CD = D.商品分類CD

 
試してないけど...

回答
投稿日時: 19/03/25 20:15:28
投稿者: hatena
投稿者のウェブサイトに移動

年月のテーブルを作成します。
 

T年月
------
年月
201804
201805
201806
・・・

 
 
クエリを新規作成して、T年月とT商品分類を追加して、年月、商品分類CD を表示させます。
 
SELECT T年月.年月, T商品分類.商品分類CD FROM T年月, T商品分類;
 
このクエリの名前を Q_年月_商品分類 とします。
出力結果
 
年月    商品分類CD
201804    A001
201804    A002
201804    A003
201805    A001
201805    A002
201805    A003
・・・

クエリを新規作成して、Q_年月_商品分類 と Q_売上 を外部結合(LEFT JOIN)します。
 
SELECT 
       B.年月 
       ,A.商品分類CD 
       ,Nz(B.本年売上,0) AS 本年売上
       ,Nz(B.前年売上,0) AS 前年売上
 FROM 
       Q_年月_商品分類 AS A 
       LEFT JOIN Q_売上 AS B 
       ON A.商品分類CD=B.商品分類CD AND A.年月=B.年月;

 
 
以上で希望の結果になるでしょう。
 

回答
投稿日時: 19/03/26 03:03:07
投稿者: mayu.

売上がない年月の商品分類データだけをSQLで動的に生成して
売上データと縦に結合する方法もありますので、参考までにご紹介します。
  
なお、SQLのパフォーマンスが良く、
Q_売上に1件もデータが存在しない月でもデータが補完表示されるのは
hatenaさんの方法になります。
  

SELECT 年月
     , 商品分類CD
     , 本年売上
     , 前年売上
FROM Q_売上
UNION ALL
SELECT DISTINCT
       y.年月
     , x.商品分類CD
     , 0
     , 0
FROM T商品分類 x
   , Q_売上    y
WHERE NOT EXISTS
(
    SELECT 1 FROM Q_売上 z
     WHERE z.年月 = y.年月
       AND z.商品分類CD = x.商品分類CD 
)
ORDER BY 1, 2 ;

投稿日時: 19/03/26 08:57:55
投稿者: hato

よろずやさん、hatenaさん、mayu. さん 早速のご回答ありがとうございます!
 
いろんなやり方があるんですね。どれも思うような結果を出すことができました。
とても勉強になりました。
本当にありがとうございました!!