Sql 如何按项目将每个组作为单独的列进行选择?
我得到的结果是:Sql 如何按项目将每个组作为单独的列进行选择?,sql,sql-server,tsql,pivot,Sql,Sql Server,Tsql,Pivot,我得到的结果是: MachID DownCode DownTime PR01 COMP 30.83 PR02 DIE SET 378.205277777778 PR02 Die Wait 88.0533333333333 PR03 ColorChg 8.54194444444444 PR04 DieStart
MachID DownCode DownTime
PR01 COMP 30.83
PR02 DIE SET 378.205277777778
PR02 Die Wait 88.0533333333333
PR03 ColorChg 8.54194444444444
PR04 DieStart 0.205277777777778
MachID ColorChg COMP DIE SET DieStart Die Wait
PR01 0 30.83
PR02 0 0 378.205 0 88.0533
PR03 8.5419 0 0 0 0
PR04 0 0 0 0.2052 0
从查询中:
SELECT MachID, DownCode, SUM(EndTime - StartTime)/3600 AS DownTime
FROM vReportDownLog
GROUP BY MachID, DownCode
但我真的想要这样的东西:
MachID DownCode DownTime
PR01 COMP 30.83
PR02 DIE SET 378.205277777778
PR02 Die Wait 88.0533333333333
PR03 ColorChg 8.54194444444444
PR04 DieStart 0.205277777777778
MachID ColorChg COMP DIE SET DieStart Die Wait
PR01 0 30.83
PR02 0 0 378.205 0 88.0533
PR03 8.5419 0 0 0 0
PR04 0 0 0 0.2052 0
通过这种方式使用Google可视化的数据会容易得多
基本上,我希望第一个GROUP BY column作为左列,第二个GROUP BY column作为列标题,它们之间有数字值,就像一个表一般
在做了一些工作之后,我得到了一个动态SQL的修改版本:
BEGIN TRANSACTION
DECLARE @UsePivot as VARCHAR(MAX)
DECLARE @sql VARCHAR(MAX)
-- clever way of concatenating the rows of that column
-- just a little bit cleaner than using a cursor
-- and probably faster, too. Requires I think SQL 2008+
SELECT @UsePivot =
STUFF((
SELECT DISTINCT ',[' + DownCode + ']'
FROM DownCodes
FOR XML PATH('')
), 1, 1, '' )
SET @sql = '
SELECT MachID, ' + @UsePivot + ' FROM
(
SELECT MachID, DownCode, SUM(CAST(EndTime AS Float) - CAST(StartTime AS Float))/3600 AS DownTime
FROM vReportDownLog
GROUP BY
MachID, DownCode
) TBL
PIVOT
(
SUM(DownTime)
FOR DownCode IN (' + @UsePivot + ')
)
AS Pvt'
EXEC (@sql)
ROLLBACK
使用枢轴:
我进行了一个动态查询,以匹配表中所有occurrence的下行代码。可能需要在该语句中添加一个Where子句?无论我把它放在哪里,我都会遇到语法错误。在这个查询的顶部再添加一个select语句,在那里添加where子句。谢谢。你能详细解释一下它是如何工作的吗,这样我就能理解PIVOT在做什么了?我们是基于行值来旋转数据的,你用这个@kthprog得到答案了吗?难道不能用一个选择子查询来替换整个游标+@usePivot表达式吗?例如,在“从下行代码中选择不同的下行代码?”中选择下行代码?@KthProg是的,这也会起作用。我试图提供一个通用的解决方案,以防您希望使用具有特定名称(如日期)的数据透视。如果不是,它将是这样的:选择MachID,*从vReportDownLog PIVOT SUMEndTime-StartTime/3600中选择DownCode作为MachIDIs的Pvt组从DownCode中选择DISTINCT DownCode这是2008年提供的吗?SQL Server似乎真的不合作。它将WHERE子句显示为语法错误。我删除了WHERE子句,现在EndTime-StartTime中的“-”显示为语法错误。您能给我您正在测试的完整查询吗?我有SQLServer2008,并在那里测试了它,所以它应该可以工作。您的问题不包含任何WHERE子句。@KthProg如果您能提供表架构,也会很有帮助。
select * from table pivot (sum(downtime) for downcode in
(COMP,
[DIE SET],
[Die Wait],
ColorChg,
DieStart) )as pvt