SQL Server:转动或不转动

时间:2016-12-07 23:42:10

标签: sql-server select pivot

我有一个表格,我在其中运行一个select语句并返回以下数据

Name    date           skill    seconds  calls
----------------------------------------------
bob     9/2/2016       706      12771    56
bob     9/2/2016       707      4061     16
bob     9/2/2016       708      2577     15
bob     9/2/2016       709      2156     6

我想在下面的一行数据中返回:

Name date     706sec   706call  707sec  707call  708sec  708call 709sec  709call
----------------------------------------------------------------------------------
bob  9/2/2016 12771     56       4061     16      2577     15     2156     6

我的第一次尝试是一个支点,但没有返回一行:

Select 
    name, date, seconds, calls, [706], [707],[708],[709],  
from 
    (Select 
         name, date, skill, seconds, calls
     From
         tablecalls 
     Where 
         date between '09/02/2016 00:00' and '09/02/2016 23:59' 
         and name = 'bob') as b
pivot 
    (sum(seconds) for skill in ([706], [707], [708], [709] )) as p1

返回:

name    date      calls 706sec  707sec  708sec  709sec
---------------------------------------------------------
bob     9/2/2016    6   NULL    NULL    NULL    2156
bob     9/2/2016   15   NULL    NULL    2577    NULL
bob     9/2/2016   16   NULL    4061    NULL    NULL
bob     9/2/2016   56   12771   NULL    NULL    NULL

也许PIVOT不是正确的方法。还有另一种方式吗?

1 个答案:

答案 0 :(得分:1)

可以格式化您的数据吗?我不确定我是否明白了?

    CREATE TABLE #tt([name] VARCHAR(10),[date] DATE,skill INT,seconds INT, calls int )
    INSERT INTO #tt
    SELECT 'bob','9/2/2016',706,12771,56 UNION all
    SELECT 'bob','9/2/2016',707,4061,16  UNION all
    SELECT 'bob','9/2/2016',708,2577,15  UNION all
    SELECT 'bob','9/2/2016',709,2156,6 

    SELECT * FROM (
        SELECT t.name,t.date,c.* FROM #tt AS t
        CROSS APPLY(VALUES(LTRIM(t.skill)+'sec',t.seconds),(LTRIM(t.skill)+'calls',t.seconds)) c(t,v)
    ) AS A
    PIVOT(MAX(v) FOR t IN ([706sec],[706calls],[707sec],[707calls],[708sec],[708calls],[709sec],[709calls])) p
name       date       706sec      706calls    707sec      707calls    708sec      708calls    709sec      709calls
---------- ---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
bob        2016-09-02 12771       12771       4061        4061        2577        2577        2156        2156

如果技能计数未修复,您可以使用动态脚本:

    DECLARE @col VARCHAR(max),@sql VARCHAR(max)
    SELECT @col=ISNULL(@col+',[','[')+LTRIM(skill)+'sec],['+LTRIM(skill)+'calls]' FROM #tt GROUP BY skill
    SET @sql='
    SELECT * FROM (
        SELECT t.name,t.date,c.* FROM #tt AS t
        CROSS APPLY(VALUES(LTRIM(t.skill)+''sec'',t.seconds),(LTRIM(t.skill)+''calls'',t.seconds)) c(t,v)
    ) AS A
    PIVOT(MAX(v) FOR t IN ('+@col+')) p'
    EXEC (@sql)