Jak převést dynamické 7 denně řádků do sloupců s T-SQL

hlasů
1

Pozadí Info Mám velký stůl 400 + řádky, které denně změny (jeden den údaje vypadne, že následná dat nové dní kapky) Tabulka je rozdělena na ‚Den‘ pole, takže existuje 31 paritions. Každý řádek v tabulce obsahuje data podobná této:

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

Musím vytáhnout 7 dní dat ve formátu:

Postcode, Deliverypoint, 7dayAverage, Day1,day2,Day3,Day4,Day5,Day6,Day7  
SN1 1BG      A1             2          0    1    2    1    3    4   0

Mohu snadno extrahovat data za 7 dní, ale je třeba vytvořit sloupovitý verzi, jak je uvedeno výše.

Mám něco takového:

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

kde #days má čísla den v sedm dnů.

Ale jak vidíte, jsem pevně čísla denně do dotazu, chci se dostat ven z mé dočasné tabulkové #days ale nevidí způsob, jak to udělat (pole by bylo ideální zde)

Nebo budu o tom v úplně špatným směrem?

S přátelským pozdravem

Steve

Položena 29/01/2014 v 14:06
uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
0

Jestli tomu správně rozumím, co budu dělat, je:

  1. Převést den a měsíc sloupců do hodnot data a času,
  2. Získat první den týdne a dne v týdnu (1-7) pro každý den, a
  3. Otočit data a skupiny první den v týdnu

viz zde: sqlfiddle

Odpovězeno 29/01/2014 v 16:22
zdroj uživatelem

hlasů
0

Jako utexaspunk navrhl, Pivot může být způsob, jak jít. Nikdy jsem nebyl spokojeni s otočným čepem a raději ji otáčet ručně, takže jsem se ovládat, jak to všechno vypadá, takže jsem za použití podobného řešení, jak jste skript k řešení tohoto problému. Nemám ponětí, jak se výkon mezi mé cestě a utexaspunk se bude porovnávat.

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
Odpovězeno 29/01/2014 v 16:29
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more