2011-11-09 20 views
1

我不完全確定我所需要的是否可能。我有兩張加入的表格,一張是物品清單,另一張是指定日期那些物品有任何移動。這個運動由累加器指定,在這個例子中1 =購買,2 =賣出,3 =調整。目前爲止我的編碼爲每個累加器提供了一個單獨的行。我需要將各行合併爲一個項目。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  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  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 
1 
2 
3 
4 

的物品移動的RPT_ITM_D下設我需要它導致:

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

假設你是MS SQL Server上,你可以使用PIVOT實現 - 對於解釋和一些例子看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。例如,information_schema.COLUMNS會在MYSQL中爲你保存這個信息,並且你可以從那裏選擇它,就像從其他表中一樣,並且在與你的表聯接時將這些返回的值交叉。