如何使用t-sql将动态7天行转换为列
背景信息 我有一个400多行的大表,每天都在变化(一天的数据丢失,一天的数据丢失),表在“天”字段上分区,因此有31个分区。 表中的每一行都有类似的数据:如何使用t-sql将动态7天行转换为列,sql,tsql,Sql,Tsql,背景信息 我有一个400多行的大表,每天都在变化(一天的数据丢失,一天的数据丢失),表在“天”字段上分区,因此有31个分区。 表中的每一行都有类似的数据: ID, Postcode, DeliveryPoint, Quantity, Day, Month 1 SN1 1BG A1 6 29 1 2 SN1 1BG A1 1 28 1 3 SN1 1BG A2
ID, Postcode, DeliveryPoint, Quantity, Day, Month
1 SN1 1BG A1 6 29 1
2 SN1 1BG A1 1 28 1
3 SN1 1BG A2 2 27 1
4 SN1 1BG A1 3 28 1
5 SN2 1AQ B1 1 29 12
6 SN1 1BG A1 2 26 12
我需要以以下格式提取7天的数据:
Postcode, Deliverypoint, 7dayAverage, Day1,day2,Day3,Day4,Day5,Day6,Day7
SN1 1BG A1 2 0 1 2 1 3 4 0
我可以很容易地提取7天期间的数据,但需要创建如上所示的专栏版本
我有这样的想法:
select postcode,deliverypoint,
sum (case day when 23 then quantity else 0 end) as day1,
sum (case day when 24 then quantity else 0 end) as day2,
sum(case day when 25 then quantity else 0 end) as day3,
sum(case day when 26 then quantity else 0 end) as day4,
sum(case day when 27 then quantity else 0 end) as day5,
sum(case day when 28 then quantity else 0 end) as day6,
sum(case day when 29 then quantity else 0 end) as day7,
sum(quantity)*1.0/@daysinweek as wkavg
into #allweekdp
from maintable dp with (nolock)
where day in (select day from #days)
group by postcode,deliverypoint
其中#days具有7天期间的天数
但正如您所见,我已将日数硬编码到查询中,我想将其从临时表中取出#days,但找不到一种方法(这里最好是数组)
还是我完全错误地处理这件事
问候
史蒂夫如果我理解正确,我会做的是:
请参见此处:正如utexaspunk所建议的,Pivot可能是一条可行之路。我对pivot从来都不满意,我更喜欢手动旋转它,这样我就可以控制一切的外观,所以我使用了一种类似于您使用脚本来解决问题的解决方案。不知道我的方式和utexaspunk之间的性能会如何比较
Declare @Min_Day Integer = Select MIN(day) as Min_Day From #days;
With Day_Coding_CTE as (
Select Distinct day
, day - @Min_Day + 1 as Day_Label
From #days
)
, Non_Columnar_CTE as (
Select dp.postcode
, dp.deliverypoint
, d.day
, c.Day_Label
, SUM(quantity) as Quantity
From maintable dp with (nolock)
Left Outer Join #days d
on dp.day = d.day --It also seems like you'll need more criteria here, but you'll have to figure out what those should be
Left Outer Join Day_Coding_CTE c
on d.day = c.day
)
Select postcode
, deliverypoint
, SUM(Case
When Day_Label = 1
Then Quantity
Else 0
End) as Day1
, SUM(Case
When Day_Label = 2
Then Quantity
Else 0
End) as Day2
, SUM(Case
When Day_Label = 3
Then Quantity
Else 0
End) as Day3
, SUM(Case
When Day_Label = 4
Then Quantity
Else 0
End) as Day4
, SUM(Case
When Day_Label = 5
Then Quantity
Else 0
End) as Day5
, SUM(Case
When Day_Label = 6
Then Quantity
Else 0
End) as Day6
, SUM(Case
When Day_Label = 7
Then Quantity
Else 0
End) as Day7
, SUM(Quantity)/@daysinweek as wkavg
From Non_Columnar_CTE
Group by postcode
deliverypoint