2016-01-05 5 views
2

У меня есть следующие данные.Вычислить сумму из 4 строк в SQL

WM_Week POS_Store_Count POS_Qty POS_Sales POS_Cost 
    ------ --------------- ------ -------- -------- 
    201541 3965   77722 153904.67 102593.04 
    201542 3952   77866 154219.66 102783.12 
    201543 3951   70690 139967.06 94724.60 
    201544 3958   70773 140131.41 95543.55 
    201545 3958   76623 151739.31 103441.05 
    201546 3956   73236 145016.54 98868.60 
    201547 3939   64317 127368.62 86827.95 
    201548 3927   60762 120309.32 82028.70 

Мне нужно написать запрос SQL, чтобы получить последние четыре недели данных, и их последние четыре недели суммируются для каждого из следующих столбцов: POS_Store_Count, POS_QtyPOS_Sales, и POS_Cost.

Например, если бы мне нужны данные 201548, он будет содержать 201548, 201547, 201546 и 201545 гг.

Сумма 201547 будет содержать 201547, 201546, 201545 и 201544.

запрос должен возвращать 4 строки, когда побежал успешно.

Как бы я сформулировал рекурсивный запрос для этого? Есть ли что-то более легкое, чем рекурсивное?

Редактировать: версия Azure Sql DW с номером версии 12.0.2000. Edit2: Четыре строки, которые должны быть возвращены, будут иметь сумму столбцов от себя, и это три предыдущих недели.

Например, если бы я хотел, чтобы данные за 201548 это вернуть бы следующее:

WM_Week POS_Store_Count POS_Qty POS_Sales POS_Cost 
------ --------------- ------- -------- -------- 
201548 15780   274938 544433.79 371166.3 

который является суммой четырех (нетождественности) столбцы из 201548, 201547, 201546 и 201545.

+1

Что запрос вы пробовали до сих пор? – Becuzz

+0

Что вы пытаетесь «суммировать»? Вероятно, вы можете сделать это с помощью очень простого запроса, используя 'top',' where' и 'order by desc' ... – sgeddes

+0

@sgeddes Мои извинения, я пытаюсь суммировать столбцы 'POS_Store_Count',' POS_Qty', 'POS_Sales' и' POS_Cost'. Я уточню свой вопрос. – Cameron

ответ

7

уверен, это поможет вам, что вы хотите .. Im используя крест применять после упорядочения данных, чтобы применить СУММЫ

Create Table #WeeklyData (WM_Week Int, POS_Store_Count Int, POS_Qty Int, POS_Sales Money, POS_Cost Money) 

Insert #WeeklyData Values 
(201541,3965,77722,153904.67,102593.04), 
(201542,3952,77866,154219.66,102783.12), 
(201543,3951,70690,139967.06,94724.6), 
(201544,3958,70773,140131.41,95543.55), 
(201545,3958,76623,151739.31,103441.05), 
(201546,3956,73236,145016.54,98868.6), 
(201547,3939,64317,127368.62,86827.95), 
(201548,3927,60762,120309.32,82028.7) 

DECLARE @StartWeek INT = 201548; 
WITH cte AS 
(
    SELECT *, 
      ROW_NUMBER() OVER (ORDER BY [WM_Week] DESC) rn 
    FROM #WeeklyData 
    WHERE WM_Week BETWEEN @StartWeek - 9 AND @StartWeek 
) 
SELECT * 
FROM cte c1 
CROSS APPLY (SELECT SUM(POS_Store_Count) POS_Store_Count_SUM, 
        SUM(POS_Qty) POS_Qty_SUM, 
        SUM(POS_Sales) POS_Sales_SUM, 
        SUM(POS_Cost) POS_Cost_SUM 
      FROM cte c2 
      WHERE c2.rn BETWEEN c1.rn AND (c1.rn + 3) 
) ca  
WHERE c1.rn <= 4 
+2

Я думаю, что это то, что вы хотите. @ JamieD77 все учел. Я добавил записи, чтобы вы могли протестировать их с предоставленными вводом, поскольку я, по крайней мере, сделал это. :) –

+0

@ Love2Learn спасибо! .. Sql скрипка для меня не работает прямо сейчас по какой-то причине или я бы показал свою работу там – JamieD77

+0

Awesome! Это в значительной степени то, что я искал. Единственная проблема сейчас в том, что у меня на самом деле есть еще 15 столбцов или около того, что мне нужно интегрировать в нее. И производительность запроса ужасна. Но спасибо за ваш ответ! – Cameron

0

Если я правильно понял, вы не хотите возвращать 4 строки, а всего 4 суммированных столбца для каждой группы? Если да, то вот один вариант:

select max(WM_Week) as WM_Week, 
     sum(POS_Store_Count), 
     sum(POS_Qty), 
     sum(POS_Sales), 
     sum(POS_Cost) 
from (select top 4 * 
     from yourtable 
     where wm_week <= 201548 
     order by wm_week desc) t 

Это используется подзапрос с top, чтобы получить 4 строки, которые вы хотите агрегировать на основе where критериев и order by пункта.


Вот сгущенное fiddle демонстрирует пример (извините скрипку не поддерживает сервер SQL прямо сейчас, поэтому синтаксис немного выключен):

1

Вы можете использовать SUM() в сочетании с OVER Clause

Что-то вроде:

SELECT WM_Week. 
, SUM(POS_Store_Count) OVER (ORDER BY WM_Week ROWS BETWEEN 3 PRECEDING AND CURRENT ROW) 
FROM Table 
1

Вы должны быть в состоянии использовать функцию окна SQL для этого.

Добавить столбец в запрос вроде следующего:

SUM(POS_Sales) OVER(
    ORDER BY WM_Week 
    ROWS BETWEEN 3 PRECEDING AND CURRENT ROW 
) AS POS_Sales_4_Weeks 
Смежные вопросы