sql >> Database teknologi >  >> RDS >> Sqlserver

Tilpasset beregning for beløb

Her er en alternativ tilgang, der kræver LAG(), som er tilgængelig fra SQL 2012, men bemærk, at eksempeldataene ikke indeholder "28 distinkte dage" før hver dato. Den faktiske datatype, der bruges, er heller ikke kendt (dato/smalldatetime/datetime/datetime2), og det vides heller ikke, om det er nødvendigt at afkorte tid fra dato. Så med nogle forbehold opretter denne tilgang en række datointervaller for de 28 forskellige datoer (men hvis dataene ikke giver disse, er de 28 forløbne dage). Her er en sqlfiddle-demo

PostgreSQL 9.3 Schema Setup :(som SQL Server ikke fungerer på sqlfiddle)

CREATE TABLE Table1
    (theDate timestamp, Value int, promo int, item int)
;

INSERT INTO Table1
    (theDate, Value, promo, item)
VALUES
    ('2011-01-01 00:00:00', 626, 0, 1230),
    ('2011-01-02 00:00:00', 231, 1, 1230),
    ('2011-01-03 00:00:00', 572, 1, 1230),
    ('2011-01-04 00:00:00', 775, 1, 1230),
    ('2011-01-05 00:00:00', 660, 1, 1230),
    ('2011-01-06 00:00:00', 662, 1, 1230),
    ('2011-01-07 00:00:00', 541, 1, 1230),
    ('2011-01-08 00:00:00', 849, 1, 1230),
    ('2011-01-09 00:00:00', 632, 1, 1230),
    ('2011-01-10 00:00:00', 906, 1, 1230),
    ('2011-01-11 00:00:00', 961, 1, 1230),
    ('2011-01-12 00:00:00', 361, 0, 1230),
    ('2012-01-01 00:00:00', 461, 0, 1230),
    ('2012-01-02 00:00:00', 928, 1, 1230),
    ('2012-01-03 00:00:00', 855, 0, 1230),
    ('2012-01-04 00:00:00', 605, 0, 1230),
    ('2012-01-05 00:00:00', 83, 0, 1230),
    ('2012-01-06 00:00:00', 44, 0, 1230),
    ('2012-01-07 00:00:00', 382, 0, 1230),
    ('2012-01-08 00:00:00', 862, 0, 1230),
    ('2012-01-09 00:00:00', 549, 0, 1230),
    ('2012-01-10 00:00:00', 632, 0, 1230),
    ('2012-01-11 00:00:00', 2, 0, 1230),
    ('2012-01-12 00:00:00', 26, 0, 1230)
;
 

Forespørgsel 1 :

select
      t1.item
    , ranges.theStart
    , ranges.theEnd
    , sum(t1.value)
    , sum(t1.value) / 28 avg
from (
      select
            coalesce(lag(theDay,28) over(order by theDay) , theDay - INTERVAL '28 DAYS') as theStart
          , theDay as theEnd
      from (
            select distinct cast(thedate as date) theDay from Table1
            ) days
      ) ranges
inner join table1 t1 on theDate between ranges.theStart and ranges.theEnd
group by
      t1.item
    , ranges.theStart
    , ranges.theEnd
 

Resultater :

| item | thestart | theend | sum | avg | |------|----------------------------|---------------------------|------|-----| | 1230 | December, 04 2010 00:00:00 | January, 01 2011 00:00:00 | 626 | 22 | | 1230 | December, 05 2010 00:00:00 | January, 02 2011 00:00:00 | 857 | 30 | | 1230 | December, 06 2010 00:00:00 | January, 03 2011 00:00:00 | 1429 | 51 | | 1230 | December, 07 2010 00:00:00 | January, 04 2011 00:00:00 | 2204 | 78 | | 1230 | December, 08 2010 00:00:00 | January, 05 2011 00:00:00 | 2864 | 102 | | 1230 | December, 09 2010 00:00:00 | January, 06 2011 00:00:00 | 3526 | 125 | | 1230 | December, 10 2010 00:00:00 | January, 07 2011 00:00:00 | 4067 | 145 | | 1230 | December, 11 2010 00:00:00 | January, 08 2011 00:00:00 | 4916 | 175 | | 1230 | December, 12 2010 00:00:00 | January, 09 2011 00:00:00 | 5548 | 198 | | 1230 | December, 13 2010 00:00:00 | January, 10 2011 00:00:00 | 6454 | 230 | | 1230 | December, 14 2010 00:00:00 | January, 11 2011 00:00:00 | 7415 | 264 | | 1230 | December, 15 2010 00:00:00 | January, 12 2011 00:00:00 | 7776 | 277 | | 1230 | December, 04 2011 00:00:00 | January, 01 2012 00:00:00 | 461 | 16 | | 1230 | December, 05 2011 00:00:00 | January, 02 2012 00:00:00 | 1389 | 49 | | 1230 | December, 06 2011 00:00:00 | January, 03 2012 00:00:00 | 2244 | 80 | | 1230 | December, 07 2011 00:00:00 | January, 04 2012 00:00:00 | 2849 | 101 | | 1230 | December, 08 2011 00:00:00 | January, 05 2012 00:00:00 | 2932 | 104 | | 1230 | December, 09 2011 00:00:00 | January, 06 2012 00:00:00 | 2976 | 106 | | 1230 | December, 10 2011 00:00:00 | January, 07 2012 00:00:00 | 3358 | 119 | | 1230 | December, 11 2011 00:00:00 | January, 08 2012 00:00:00 | 4220 | 150 | | 1230 | December, 12 2011 00:00:00 | January, 09 2012 00:00:00 | 4769 | 170 | | 1230 | December, 13 2011 00:00:00 | January, 10 2012 00:00:00 | 5401 | 192 | | 1230 | December, 14 2011 00:00:00 | January, 11 2012 00:00:00 | 5403 | 192 | | 1230 | December, 15 2011 00:00:00 | January, 12 2012 00:00:00 | 5429 | 193 |

NB:Til SQL Server

  • i stedet for theDay - INTERVAL '28 DAYS' brug dateadd(day,-28,theDay)


  1. MySQL Opret visning, Erstat visning og slip visningserklæringer med eksempler

  2. Oracle Database Test Challenge - Sammenlign Skema Data

  3. Opret Java på Oracle-database med JDBC

  4. Kan du tilføje en hvis-erklæring i ORDER BY?