SQL将行转换为列
我不确定我需要的东西是否可能。我有两个连接的表,一个是项目列表,另一个是在指定日期这些项目发生任何移动时。移动由累加器指定,在本例中,1=购买,2=出售,3=调整。到目前为止,我的编码为每个累加器提供了一个单独的行。我需要为每个项目将行合并为一行SQL将行转换为列,sql,join,rows,Sql,Join,Rows,我不确定我需要的东西是否可能。我有两个连接的表,一个是项目列表,另一个是在指定日期这些项目发生任何移动时。移动由累加器指定,在本例中,1=购买,2=出售,3=调整。到目前为止,我的编码为每个累加器提供了一个单独的行。我需要为每个项目将行合并为一行 SELECT [Totalizer]=COALESCE(t2.[F1034],0) ,[UPC]=t1.[F01] ,[QTY]=sum(coalesce(t2.[F64],0)) ,[Total Amount]=s
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
“成本”选项卡表包括:
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
我现在使用的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 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
我意识到我可能必须完全返工我的列,但我不知道从哪里开始,或者我是否可以这样做。在您的模式名称空间/数据库中,您将找到表的定义。存储表定义的确切表因使用的DBMS而异。例如,information_schema.COLUMNS将在MYSQL中为您保存此信息,您可以像从任何其他表中一样从中选择它,并在与表的联接中交叉这些返回值。在您的模式名称空间/数据库中,您将找到表的定义。存储表定义的确切表因使用的DBMS而异。例如,information_schema.COLUMNS将在MYSQL中为您保存此信息,您可以像从任何其他表中一样从中选择它,并在与表的联接中交叉这些返回值。假设您在MS SQL Server上,您可以使用
PIVOT
实现此目的-有关说明和一些示例,请参阅和
另一个选项是使用子选择:
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
关于性能/执行计划,您应该比较这两个选项。假设您在MS SQL Server上,您可以使用
PIVOT
实现这一点-有关说明和一些示例,请参阅和
另一个选项是使用子选择:
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
关于性能/执行计划,您应该比较这两个选项。名为F1034、F64和F65的字段?我希望这些在你的背景下是有意义的,而不是一些从未见过日光dba设计理念的窑洞。这是一些零售组织方法。。我们的商店数据库使用它。。大多数时候都是PITA..名为F1034、F64和F65的字段?我希望这些在你的背景下是有意义的,而不是一些从未见过日光dba设计理念的窑洞。这是一些零售组织方法。。我们的商店数据库使用它。。这是一个皮塔大部分时间..我不得不做一些调整,但在那之后工作得很好。一些调整是将coalesce带到select前面,并修复了X.F01=T2.F254。。谢谢,我不得不对它做一些调整,但之后效果很好。一些调整是将coalesce带到select前面,并修复了X.F01=T2.F254。。非常感谢。