Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Персонализирано изчисление на сумата

Ето алтернативен подход, който изисква LAG(), който е достъпен от SQL 2012, но имайте предвид, че примерните данни не съдържат „28 отделни дни“ преди всяка дата. Също така действителният тип данни, който се използва, не е известен (дата/smalldatetime/datetime/datetime2), нито е известно дали е необходимо съкращаване на времето от датата. Така че с някои предупреждения този подход създава поредица от периоди от време за 28-те отделни дати (но ако данните не ги предоставят, тогава те са 28 изминали дни). Ето една демонстрация на sqlfiddle

Настройка на схемата на PostgreSQL 9.3 :(тъй като SQL Server не работи в 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); 

Заявка 1 :

изберете t1.item, ranges.theStart, ranges.theEnd, sum(t1.value) , sum(t1.value) / 28 avgfrom ( изберете coalesce(lag(theDay,28) over(order by theDay) ), theDay - ИНТЕРВАЛ '28 DAYS') като начало, theDay като край от (изберете отделно предаване (датата като дата) theDay от Table1) дни) rangesinner присъединяване към таблица1 t1 на theDate между ranges.theStart и ranges.theEndgroup от t1.item , ranges.theStart , ranges.theEnd 

Резултати :

<предварителен код>| елемент | началото | край | сума | ср. ||------|----------------------------|----------- ----------------|------|-----|| 1230 | 04 декември 2010 г. 00:00:00 | 01 януари 2011 г. 00:00:00 | 626 | 22 || 1230 | 05 декември 2010 г. 00:00:00 | 02 януари 2011 г. 00:00:00 | 857 | 30 || 1230 | 06 декември 2010 г. 00:00:00 | 03 януари 2011 г. 00:00:00 | 1429 | 51 || 1230 | 07 декември 2010 г. 00:00:00 | 04 януари 2011 г. 00:00:00 | 2204 | 78 || 1230 | 08 декември 2010 г. 00:00:00 | 05 януари 2011 г. 00:00:00 | 2864 | 102 || 1230 | 09 декември 2010 г. 00:00:00 | 06 януари 2011 г. 00:00:00 | 3526 | 125 || 1230 | 10 декември 2010 г. 00:00:00 | 07 януари 2011 г. 00:00:00 | 4067 | 145 || 1230 | 11 декември 2010 г. 00:00:00 | 08 януари 2011 г. 00:00:00 | 4916 | 175 || 1230 | 12 декември 2010 г. 00:00:00 | 09 януари 2011 г. 00:00:00 | 5548 | 198 || 1230 | 13 декември 2010 г. 00:00:00 | 10 януари 2011 г. 00:00:00 | 6454 | 230 || 1230 | 14 декември 2010 г. 00:00:00 | 11 януари 2011 г. 00:00:00 | 7415 | 264 || 1230 | 15 декември 2010 г. 00:00:00 | 12 януари 2011 г. 00:00:00 | 7776 | 277 || 1230 | 04 декември 2011 г. 00:00:00 | 01 януари 2012 г. 00:00:00 | 461 | 16 || 1230 | 05 декември 2011 г. 00:00:00 | 02 януари 2012 г. 00:00:00 | 1389 | 49 || 1230 | 06 декември 2011 г. 00:00:00 | 03 януари 2012 г. 00:00:00 | 2244 | 80 || 1230 | 07 декември 2011 г. 00:00:00 | 04 януари 2012 г. 00:00:00 | 2849 | 101 || 1230 | 08 декември 2011 г. 00:00:00 | 05 януари 2012 г. 00:00:00 | 2932 | 104 || 1230 | 09 декември 2011 г. 00:00:00 | 06 януари 2012 г. 00:00:00 | 2976 | 106 || 1230 | 10 декември 2011 г. 00:00:00 | 07 януари 2012 г. 00:00:00 | 3358 | 119 || 1230 | 11 декември 2011 г. 00:00:00 | 08 януари 2012 г. 00:00:00 | 4220 | 150 || 1230 | 12 декември 2011 г. 00:00:00 | 09 януари 2012 г. 00:00:00 | 4769 | 170 || 1230 | 13 декември 2011 г. 00:00:00 | 10 януари 2012 г. 00:00:00 | 5401 | 192 || 1230 | 14 декември 2011 г. 00:00:00 | 11 януари 2012 г. 00:00:00 | 5403 | 192 || 1230 | 15 декември 2011 г. 00:00:00 | 12 януари 2012 г. 00:00:00 | 5429 | 193 |

NB:За SQL Server

  • вместо theDay - ИНТЕРВАЛ „28 ДНИ“ използвайте dateadd(day,-28,theDay)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да предам променлива, която съдържа списък, към динамична SQL заявка?

  2. Как могат да бъдат временно деактивирани ограниченията на външния ключ с помощта на T-SQL?

  3. Има ли еквивалент на SELECT ... INTO OUTFILE в SQL Server Management Studio?

  4. Как да получа време (чч:мм:сс) от sql заявка?

  5. Най-ефективният начин за ограничаване на връщанията на редове от заявка за обединение - TSQL