2016-09-14 4 views
3

Ok、MySQL - フィールドリストに基づくデータセット。フィールドにダミー行が入力されています。

ここでこれについて同様の質問を見つけようとしました。正確に関連するものは見られません。

私は州ごとに販売データを持つテーブルを持っています。データはこのように編成されています。

SELECT * FROM SALES_BY_STATE;

PRODUCTGROUP SALES STATE MONTH YEAR 
PRODUCTGROUP1 1000 A  JAN  2016 
PRODUCTGROUP1 1000 B  JAN  2016 
PRODUCTGROUP1 1000 F  JAN  2016 
PRODUCTGROUP1 1000 G  JAN  2016 
PRODUCTGROUP1 1000 H  JAN  2016 
PRODUCTGROUP1 1000 I  JAN  2016 
PRODUCTGROUP1 1000 J  JAN  2016 
PRODUCTGROUP1 1000 K  JAN  2016 
PRODUCTGROUP2 1000 A  JAN  2016 
PRODUCTGROUP2 1000 B  JAN  2016 
PRODUCTGROUP2 1000 C  JAN  2016 
PRODUCTGROUP2 1000 D  JAN  2016 
PRODUCTGROUP2 1000 E  JAN  2016 
PRODUCTGROUP2 1000 F  JAN  2016 
PRODUCTGROUP2 1000 G  JAN  2016 
PRODUCTGROUP2 1000 H  JAN  2016 
PRODUCTGROUP2 1000 I  JAN  2016 
PRODUCTGROUP2 1000 J  JAN  2016 
PRODUCTGROUP2 1000 K  JAN  2016 

私は11の状態(A~K)を持っています。その状態に関連する行があるかどうかに関係なく、状態を示すステートメントを作成したいと思います。上記のデータからわかるように、PRODUCT2には状態A〜Kのレコードがありますが、PRODUCTGROUP1には一部がありません。

データを抽出して次のように表示します。

PRODUCTGROUP SALES STATE MONTH YEAR 
PRODUCTGROUP1 1000 A  JAN  2016 
PRODUCTGROUP1 1000 B  JAN  2016 
PRODUCTGROUP1 0  C  JAN  2016 
PRODUCTGROUP1 0  D  JAN  2016 
PRODUCTGROUP1 0  E  JAN  2016 
PRODUCTGROUP1 1000 F  JAN  2016 
PRODUCTGROUP1 1000 G  JAN  2016 
PRODUCTGROUP1 1000 H  JAN  2016 
PRODUCTGROUP1 1000 I  JAN  2016 
PRODUCTGROUP1 1000 J  JAN  2016 
PRODUCTGROUP1 1000 K  JAN  2016 
PRODUCTGROUP2 1000 A  JAN  2016 
PRODUCTGROUP2 1000 B  JAN  2016 
PRODUCTGROUP2 1000 C  JAN  2016 
PRODUCTGROUP2 1000 D  JAN  2016 
PRODUCTGROUP2 1000 E  JAN  2016 
PRODUCTGROUP2 1000 F  JAN  2016 
PRODUCTGROUP2 1000 G  JAN  2016 
PRODUCTGROUP2 1000 H  JAN  2016 
PRODUCTGROUP2 1000 I  JAN  2016 
PRODUCTGROUP2 1000 J  JAN  2016 
PRODUCTGROUP2 1000 K  JAN  2016 

意味はありますか?私は基本的に、データセットに関連する行があるかどうかに関係なく、結果に状態を表示したいと考えています。

これについてどうすればよいか分かりません。どんな助けでも大歓迎です。

+0

これは非常に問題ではありません。私はすべての状態を含む "カレンダー"テーブルのいくつかの並べ替えを作成する必要があると思うし、いくつかの動的SQLが不足しているレコードを生成する必要があります。製品グループと状態の関係は、データセットの多くの場合には存在しないため、動的ではないSQLはそれを実行できないと私は考えています。 –

+0

ありがとう、私は多分、テーブルに不足しているレコードを置くプログラムを書くことを検討する必要がありますか? – stevenbranigan82

答えて

2

デカルト積を使用して全体のリストを作成できます。これを既存のデータから構築していることに注意してください。したがって、STATEが "L"であることを突然決定した場合、そのSTATEを持つSALES_BY_STATEテーブルに少なくとも1つの行がなければなりません。期間も同じです。

テンポラリテーブルを使用すると、大きなテーブルを持っているとデカルトが吹き飛ばされません。

create temporary table if not exists pg AS select distinct PRODUCTGROUP from SALES_BY_STATE; 
create temporary table if not exists st AS select distinct STATE from SALES_BY_STATE; 
create temporary table if not exists mo AS select distinct MONTH from SALES_BY_STATE; 
create temporary table if not exists yr AS select distinct YEAR from SALES_BY_STATE; 

select list.PRODUCTGROUP, list.STATE, list.MONTH, 
    list.YEAR, IFNULL(s.SALES, 0) 

FROM 
    (select distinct PRODUCTGROUP, STATE, MONTH, YEAR 
    FROM pg, st, mo, yr ) as list 

LEFT JOIN 
    SALES_BY_STATE as s 
ON 
    list.PRODUCTGROUP = s.PRODUCTGROUP and list.STATE = s.STATE 
    and list.MONTH = s.MONTH AND list.YEAR = s.YEAR 
ORDER BY 
    list.PRODUCTGROUP, list.STATE, list.MONTH, list.YEAR 
+0

私はちょうどコメントしようとしていた、私はあなたの編集を読んで..それは良い解決策ですが、非常に効率的な私は一緒に作業しているテーブルのサイズを与えるものではありません。しかし、提案のヒープをありがとう。 – stevenbranigan82

+0

私のソリューションを更新しましたが、これはもっと速く実行する必要があります。 –

+0

メイト、輝かしい解決策!ありがとう、それは完全に働いた!私は、それを使って解決策を試して作業するためにいくつかのレポート表を作成していました。優れた仲間。私はあなたにビールも借りている – stevenbranigan82

関連する問題