SQL将行转换为列

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

我不确定我需要的东西是否可能。我有两个连接的表,一个是项目列表,另一个是在指定日期这些项目发生任何移动时。移动由累加器指定,在本例中,1=购买,2=出售,3=调整。到目前为止,我的编码为每个累加器提供了一个单独的行。我需要为每个项目将行合并为一行

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。。非常感谢。