2011-01-29 9 views
3

私は現在、SQLを学習し、次の操作を行う方法を考え出すいくつかの問題を持っている:SQLクエリ質問

テーブル:

Planned Order 
    id Item Date 
    0 1 2011-01-24 
    1 1 2011-01-26 
    2 1 2011-01-28 
    3 2 2011-01-24 
    4 3 2011-01-27 

Customer Order 
    id Item Date 
    4 2 2011-01-25 
    3 2 2011-01-24 
    2 2 2011-01-24 
    1 1 2011-01-26 
    0 1 2011-01-24 

私が生成されます次のクエリを作成しようとしていた:

Item Category   2011-01-24  2011-01-25 2011-01-26 
1  Customer_Order 1    NULL   1  
1  Planned_Order  1    NULL   1 
2  Customer_Order 2    NULL   NULL 
2  Planned_Order  1    NULL   NULL 
3  Planned_Order  NULL   NULL   NULL 

ここで、日付の下のカウントは、その日にアイテムが注文された回数です。

これはraw SQLコードでも可能ですか?私はこれがperlのような他の言語を介してデータを操作し、複数のデータベースアクセスを介して行うことができることを認識していますが、私はこれをraw SQLから直接実行したかったのです。

クエリを列から変換して行に変換するコマンド(raw sql)が見つかりません。どのように私は日付をクエリし、上記のように各日付の列を生成します。 SQL Serverの(2005/2008)で

+0

を必要としますが、SQL ServerまたはMySQLや何か他のものを使用していることでしょうか? –

+0

Drackirの質問に加えて、.NETや他のプログラミング言語を使用していますか?結果を得て、必要なレイアウトにフォーマットする必要があるかもしれません。 – nybbler

+0

動的な列を行の値(この場合はdate)から作成するのは、各データベースで異なる解決策が必要な難しい作業ですが、少なくともGoogleではピボットテーブルを使用する必要があるため、正確な答えはわかりません。 – GolezTrol

答えて

2

、あなたが必要な正確に何をすべきかオペレーター(PIVOT)ピボットを行うには

SELECT Item,Category,[2011-01-24], [2011-01-25], [2011-01-26] 
FROM 
(SELECT Item, 'Planned_Order' Category, Date 
FROM [Planned Order] 
union all 
SELECT Item, 'Customer_Order', Date 
FROM [Customer Order] 
) AS SourceTable 
PIVOT 
(
COUNT(*) 
FOR Date IN ([2011-01-24], [2011-01-25], [2011-01-26]) 
) AS PivotTable; 
+0

バットからの日付が分からず、テーブル内の別個の日付を動的に照会する必要がある場合はどうなりますか?どのようにメインクエリのカテゴリにサブクエリを指定しますか? – darewreck

+0

その場合、基本的には、select @dates = @dates + '、+ Date by Dateの日付をクエリの残りの部分と連結して、クエリを動的に構築する必要があります。 – pcofre

+0

' select @dates = @dates + '、' + Date 'selectステートメントで日付を取得することはできますが、すべての値を格納する方法はわかりません.....配列はSQLに存在しますか?ありがとう! – darewreck

1

ポータブルな方法there's:

select item, 'Customer_Order' Category, 
    COUNT(case when Date='2011-01-24' then 1 else 0 end) as `2010-01-24`, 
    COUNT(case when Date='2011-01-25' then 1 else 0 end) as `2010-01-25`, 
    COUNT(case when Date='2011-01-26' then 1 else 0 end) as `2010-01-26` 
from customer_order 
GROUP BY item 
union all 
select item, 'Planned_Order' Category, 
    COUNT(case when Date='2011-01-24' then 1 else 0 end) as `2010-01-24`, 
    COUNT(case when Date='2011-01-25' then 1 else 0 end) as `2010-01-25`, 
    COUNT(case when Date='2011-01-26' then 1 else 0 end) as `2010-01-26` 
from planned_order 
GROUP BY item 
ORDER BY item, Category 

問題がされ正面に表示したいすべての日付を知る必要があるということです。動的列リストをサポートする唯一のDBMS(私が知っている)はOracleです。他のDBMSでは、CASE文を作成するために動的SQLを生成する必要があります。

のみ非ポータブル部分があるため、フィールド名として日付を使用するのではなく、あなたが

`2010-01-24` backticks here for MySQL 
"2010-01-24" or [2010-01-24] for SQL Server 
"2010-01-24" for Oracle 
etc