Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何按项目将每个组作为单独的列进行选择?_Sql_Sql Server_Tsql_Pivot - Fatal编程技术网

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