2014-08-29 38 views
2

我得到的是这样的:如何选择每个GROUP BY项目作为单独的列?

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 

从查询:

SELECT MachID, DownCode, SUM(EndTime - StartTime)/3600 AS DownTime 
FROM vReportDownLog 
GROUP BY MachID, DownCode 

但我真的希望是这样的:

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 

这将是更容易使用与谷歌的数据这种方式可视化。

基本上,我希望第一个GROUP BY列作为左列,第二个GROUP BY列作为列标题,它们之间的数字值通常就像表一样。

一点的工作后,我得到了动态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 
+4

可能是一个['pivot'](http://technet.microsoft.com/en-us/library/ms177410(V = SQL.105)的.aspx) – 2014-08-29 15:54:40

回答

2

使用PIVOT:http://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

begin transaction 

declare @UsePivot as varchar(max) 
declare @sql as varchar(max) 
declare @downcode as varchar(100) 


DECLARE rcursor CURSOR 
    FOR SELECT DownCode FROM DownCodes 
OPEN rcursor 
FETCH NEXT FROM rcursor 
INTO @downcode 

WHILE @@FETCH_STATUS = 0 
BEGIN 

Set @UsePivot = isnull(@UsePivot,'') + '[' + LTRIM(RTRIM(@downcode)) + '],' 

FETCH NEXT FROM rcursor 
INTO @downcode 

END 
CLOSE rcursor; 
DEALLOCATE rcursor; 

---Remove last comma 
Set @UsePivot = SUBSTRING(@UsePivot,1,len(@UsePivot)-1) 

SET @sql = '(SELECT MachID, (EndTime - StartTime)/3600 as [DownTime], ' + @UsePivot + ' as [totals] FROM vReportDownLog) as TBL ' 
+ 'PIVOT (SUM(DownTime) for DownCode in (' + @UsePivot + ')) as Pvt Group by MachID' 


exec @sql 

rollback 

我做了一个动态查询,以匹配所有downcode在你的桌子上发生。

+0

为什么votedown? – 2014-08-29 16:28:40

+0

难道整个光标+ @usePivot表达式只是被SELECT子查询替换?如DownCode IN(SELECT DISTINCT DownCode FROM DownCodes)? – KthProg 2014-08-29 17:19:19

+0

@KthProg是的,这也会起作用。我试图提供一个通用的解决方案,以防您想使用特定名称(如日期)的支点。如果没有,它会是这样的:SELECT MachID,* FROM vReportDownLog PIVOT(SUM(EndTime - StartTime)/ 3600 DownCode in(SELECT DISTINCT DownCode FROM DownCodes))作为Pvt Group由MachID – 2014-08-29 17:23:22

1
select * from table pivot (sum(downtime) for downcode in 
(COMP, 
[DIE SET], 
[Die Wait], 
ColorChg, 
DieStart))as pvt 
+0

我在哪里添加这条语句中的'WHERE'子句?无论我放置在哪里,我都会得到语法错误。 – KthProg 2014-08-29 17:17:38

+0

在此查询的顶部添加一个多选语句,在那里添加where子句。 – Adi 2014-08-29 17:18:37

+0

谢谢。你能解释一下它是如何工作的吗?所以我理解PIVOT正在做什么? – KthProg 2014-08-29 17:29:22