Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用t-sql将动态7天行转换为列_Sql_Tsql - Fatal编程技术网

如何使用t-sql将动态7天行转换为列

如何使用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

背景信息 我有一个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               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,但找不到一种方法(这里最好是数组)

还是我完全错误地处理这件事

问候


史蒂夫

如果我理解正确,我会做的是:

  • 将日和月列转换为日期时间值
  • 为每个日期获取一周的第一天和工作日的第几天(1-7),以及
  • 在一周的第一天调整数据和分组

  • 请参见此处:

    正如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