我正在使用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
...
我想要构建它的方式是否可能?
答案 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
看起来像这样:
但这并不能解决你的问题。那么如果我们在第一个CTE上放置一个数据透视表并将其作为数据透视的基础 - 我将在这里使用CTE,并使用与上面相同的表达式(以节省空间)。
select * from CTE
PIVOT ( MAX(HOURS) for DAY in ([Mon],[Tues],[Wed],[Thurs],[Fri])) as pvt
结果如下:
我们可以通过以下方式从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行。