2011-11-09 11 views
1

私が必要としていることが可能かどうかは確かではありません。参加している2つのテーブルがあります.1つはアイテムのリストで、もう1つは指定された日付のアイテムの動きがあったときです。動作はトータライザによって指定されます。この例では、1 =購入済み、2 =売却済み、3 =調整済です。これまでのコーディングでは、各トータライザの行が分かれています。私は行を各項目ごとに1つにまとめる必要があります。SQLが行を列に変換する

SELECT [Totalizer]=COALESCE(t2.[F1034],0) 
     ,[UPC]=t1.[F01] 
     ,[QTY]=sum(coalesce(t2.[F64],0)) 
     ,[Total Amount]=sum(COALESCE(t2.[F65],0)) 
FROM [STORESQL].[dbo].[COST_TAB] t1 
LEFT OUTER JOIN [STORESQL].[dbo].[RPT_ITM_D] t2 
ON t1.F01=t2.F01 AND (F254='2011-10-1') and (F1034=1 or F1034=2 or F1034=3) 
group by t1.F01,F1034 
order by t1.F01 

COST_TABテーブルの構成は次のとおりです。

UPC 
1 
2 
3 
4 

RPT_ITM_Dは、アイテムの動きで構成されています

UPC  Date  Totalizer  QTY  Total Amount 
1  2011-10-1 1    1  9.00 
1  2011-10-1 2    1  9.99 
2  2011-10-1 1    2  6.00 
2  2011-10-1 2    1  3.99 
2  2011-10-1 3    1  3.00 
3  2011-10-1 1    1  1.00 
4  2011-10-1 0    0  0.00 

私は:

UPC  Date  Totalizer  QTY  Total Amount 
1  2011-10-1 1    1  9.00 
1  2011-10-1 2    1  9.99 
2  2011-10-1 1    2  6.00 
2  2011-10-1 2    1  3.99 
2  2011-10-1 3    1  3.00 
3  2011-10-1 1    1  1.00 

SQLコードの私が今につながる持っています結果を得るためにそれが必要です:

UPC  Date  Purchased AMT Sold AMT Adjusted AMT 
1  2011-10-1 1   9.00 1  9.99 0   0.00 
2  2011-10-1 2   6.00 1  3.99 1   3.00 
3  2011-10-1 1   1.00 0  0.00 0   0.00 
4  2011-10-1 0   0.00 0  0.00 0   0.00 

私はおそらく完全に私の列を手直しする必要があります実現が、私はここで開始するか分からない、あるいは私もそれを行うことができます。

+2

F1034、F64、F65という名前のフィールドはありますか?私はそれらがあなたの文脈の中で有意義であることを願っています。洞窟にはまったく見られないdbaのデザイン哲学ではありません。 –

+0

それはいくつかの小売組織の方法です。私たちの店舗データベースはそれを使用しています..それはほとんどの時間PITAです。 –

答えて

3

- 説明といくつかの例については、別のオプションは、副選択を使用することですhttp://msdn.microsoft.com/en-us/library/ms177410.aspxhttp://www.simple-talk.com/community/blogs/andras/archive/2007/09/14/37265.aspx

を参照してください。

SELECT 
T1.F01 AS UPC, 
T2.F254 AS TheDate, 
(SELECT SUM (COALESCE (X.F64, 0)) FROM [STORESQL].[dbo].[RPT_ITM_D] X WHERE X.F1034 = 1 AND X.F01 = T2.F254 AND X.F01 = T1.F01) AS PURCHASED, 
(SELECT SUM (COALESCE (X.F65, 0)) FROM [STORESQL].[dbo].[RPT_ITM_D] X WHERE X.F1034 = 1 AND X.F01 = T2.F254 AND X.F01 = T1.F01) AS AMT_P, 
(SELECT SUM (COALESCE (X.F64, 0)) FROM [STORESQL].[dbo].[RPT_ITM_D] X WHERE X.F1034 = 2 AND X.F01 = T2.F254 AND X.F01 = T1.F01) AS SOLD, 
(SELECT SUM (COALESCE (X.F65, 0)) FROM [STORESQL].[dbo].[RPT_ITM_D] X WHERE X.F1034 = 2 AND X.F01 = T2.F254 AND X.F01 = T1.F01) AS AMT_S, 
(SELECT SUM (COALESCE (X.F64, 0)) FROM [STORESQL].[dbo].[RPT_ITM_D] X WHERE X.F1034 = 3 AND X.F01 = T2.F254 AND X.F01 = T1.F01) AS ADJUSTED, 
(SELECT SUM (COALESCE (X.F65, 0)) FROM [STORESQL].[dbo].[RPT_ITM_D] X WHERE X.F1034 = 3 AND X.F01 = T2.F254 AND X.F01 = T1.F01) AS AMT_A 
FROM [STORESQL].[dbo].[COST_TAB] t1 
LEFT OUTER JOIN [STORESQL].[dbo].[RPT_ITM_D] t2 
ON t1.F01=t2.F01 AND (F254='2011-10-1') and (F1034=1 or F1034=2 or F1034=3) 
group by T1.F01, T2.F254 
ORDER BY T1.F01, T2.F254 

あなたは、両方を比較する必要がありますパフォーマンス/実行計画に関するオプション。

+0

私はそれにいくつかの調整をしなければならなかったが、その後はうまくいった。 いくつかの調整では、選択の前に合体をもたらし、X.F01 = T2.F254を修正しました。ありがとう –

1

スキーマの名前空間/データベースには、テーブルの定義があります。テーブル定義を格納する正確なテーブルは、使用しているDBMSによって異なります。たとえば、info_schema.COLUMNSはMYSQLでこの情報を保持しています。他のテーブルのようにそこからSELECTして、テーブルとの結合でそれらの戻り値を渡すことができます。あなたはそれを達成するためにPIVOTを使用することができますMS SQL Serverであると仮定すると、