2017-07-06 86 views
0

我使用SQL Server 2014Sql Custom Pivot - 这可能吗?

我有一组数据行这样的#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 

... 

是我想构造它的可能性吗?

+3

您使用的是哪个数据库? – fhossfel

+1

您可以始终连接OPEN和CLOSED,然后转到 –

+0

这在Oracle,Postgre,SQL Server中会相当简单。在MySQL或SQLite中更少。你在用哪个? – Jacobm001

回答

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,这样你就可以在查询中描述它,这样它就不会使集合函数跳动。

希望这有助于...

1

继承人做kind of pivot table manually的长篇大论方式。 它证实了jyelle的说法,但是你不能巩固一个星期五的时间跨度在不同的时期...并且你不得不每周再次回到每周的周一,周二,周五..至少我得到了我的结果中的所有11个事实只有6行。

+0

而在未来,最好至少已经提供了一个链接到一些SQL与创建的表和行插入像我的链接..那样的话,人们为了方便帮助你的工作会少一些, – JGFMK

+0

可能有办法通过排名和/或游标 – JGFMK