Sql Custom Pivot - 这可能吗?

时间:2017-07-06 21:07:00

标签: sql pivot sql-server-2014

我正在使用sql server 2014

我在#TEMP_TABLE中有一组这样的数据行:

SCORE_ID     DAY_ID      DAY     OPEN    CLOSED     DATE       STATUS
   1          1          Mon     1pm      4pm     1/1/17     green
   2          1          Mon     2pm      4pm     1/1/17     green
   3          1          Mon     3pm      5pm     1/1/17     red
   4          1          Mon     4pm      6pm     1/2/17     yellow
   5          1          Mon     5pm      7pm     1/2/17     yellow

   6          2          Tues    1pm      4pm     1/1/17     green
   7          2          Tues    2pm      4pm     1/1/17     green
   8          2          Tues    3pm      5pm     1/1/17     red
   9          2          Tues    4pm      6pm     1/2/17     yellow
   10         2          Tues    5pm      7pm     1/2/17     yellow

   11         5          Fri     12am     12am    1/1/17     green

我想尝试转动数据表,使其看起来像这样。列名将始终是常量,但值将有所不同。我们可以忽略SCORE_ID和DAY_ID。:

 DATE       STATUS      Mon        Tues      Wed      Thurs       Fri   
 1/1/17     green       1-4pm      1-4pm      -         -         12am-12am
 1/1/17     green       2-4pm      2-4pm      -         -         -
 1/1/17     red         3-5pm      3-5pm      -         -         -
 1/2/17     yellow      4-6pm      4-6pm      -         -         -
 1/2/17     yellow      5-7pm      5-7pm      -         -         -

我试图谷歌如何使用PIVOT,但我觉得我发现的那些并不真正适用于我希望如何构建数据。

select DATE, STATUS, 'Mon', 'Tues', 'Wed, 'Thurs', Fri'
from (
    select DATE, STATUS
    from #TEMP_TABLE
) d

...

我想要构建它的方式是否可能?

2 个答案:

答案 0 :(得分:2)

所以一般来说,不,这就是为什么......你没有一种独特的方法来识别你正在寻找的数据集。您可以使用常用的表格表达式一次按摩数据,以获得如下所示的小时数:

with CTE as 
(select 
    DATE, 
    STATUS, 
    RTRIM([OPEN]) + '-' + CLOSED As 'Hours',
    CAST(DATE AS varchar) + STATUS As 'GroupID',
    DAY 
from StackQuestion),
CTE2 as
(select
    DATE,
    STATUS,
    CASE DAY WHEN 'Mon' THEN Hours ELSE '-' END as 'Mon',
    CASE DAY WHEN 'Tues' THEN Hours ELSE '-' END as 'Tues',
    CASE DAY WHEN 'Wed' THEN Hours ELSE '-' END as 'Wed',
    CASE DAY WHEN 'Thurs' THEN Hours ELSE '-' END as 'Thurs',
    CASE DAY WHEN 'Fri' THEN Hours ELSE '-' END as 'Fri',   
    HOURS
from CTE)
select * from CTE2

看起来像这样:

Double-CTE Result

但这并不能解决你的问题。那么如果我们在第一个CTE上放置一个数据透视表并将其作为数据透视的基础 - 我将在这里使用CTE,并使用与上面相同的表达式(以节省空间)。

select * from CTE
PIVOT ( MAX(HOURS) for DAY in ([Mon],[Tues],[Wed],[Thurs],[Fri])) as pvt

结果如下:

CTE with PIVOT

我们可以通过以下方式从CTE2中获得类似的结果:

select
    DATE, 
    STATUS, 
    MAX(Mon) as 'Mon', 
    MAX(Tues) as 'Tues',
    MAX(Wed) as 'Wed',
    MAX(Thurs) as 'Thurs',
    MAX(Fri) as 'Fri'
from CTE2 group by DATE, STATUS, GroupID

但潜在问题将保持不变 - 因为没有办法确定具有相同开启/关闭时间的“日期”的“状态”。即使您根据这些时间键入它,上午12点至下午12点也将处于不同的行,如果它们没有碰巧与第一天的数据对齐,那么随后的日子也会如此。你需要的是某种ID,它是你所看到的唯一ID,它允许你在查询中描述它,使它不会使聚合函数失效。

希望这会有所帮助......

答案 1 :(得分:1)

这是一个漫长的做法kind of pivot table manually。 它确认了jyelle所说的,你不能在不同时期巩固周五的时间跨度......而且你不得不继续每天加入比Mon,Tues,Fri更多的时间。至少我在我的结果中得到了所有11个事实,只有6行。