2011-11-09 19 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中为你保存这个信息,并且你可以从那里选择它,就像从其他表中一样,并且在与你的表联接时将这些返回的值交叉。