Как получить сумму первых трех строк, а затем следующих трех строк в новом столбце - PullRequest
0 голосов
/ 15 января 2019

Привет, у меня есть SQL Server внутреннее соединение

SELECT a.field_name, 
       b.ticker     AS Ticker_Name, 
       Year(c.date) AS YEAR, 
       c.stock_id, 
       c.field_id, 
       Sum(c.value) AS Value 
FROM   field_table a 
       INNER JOIN stock_transaction c 
               ON a.id = c.field_id 
       INNER JOIN stocks b 
               ON b.id = c.stock_id 
WHERE  b.id = 230 
       AND c.field_id = 29 
GROUP  BY Year(c.date), 
          b.ticker, 
          c.stock_id, 
          c.field_id, 
          a.field_name; 

Я также приложил свой вывод.

enter image description here

мой результат равен сумме продаж за год. Теперь моя задача состоит в том, чтобы показать в новом столбце сумму значений трех строк. Например: 2008, 2009, 2010, затем снова сумма стоимости 2011, 2012, 2013. затем снова 2014, 2015, 2016

мой вывод желаний

enter image description here

Может кто-нибудь подсказать мне, как мне этого добиться. Спасибо заранее

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Этот ответ является лишь базовым примером, который демонстрирует, как суммировать значения из каждых трех строк в качестве нового столбца в вашем наборе результатов. Вы можете изменить это, чтобы соответствовать вашим потребностям. Пример использует ROW_NUMBER() и целочисленное деление для вычисления каждого номера группы.

Введите:

Year    Value   
2008    100.00  
2009    200.00  
2010    300.00  
2011    400.00  
2012    500.00  
2013    600.00  
2014    700.00  
2015    800.00  
2016    900.00  
2017    1000.00 
2018    1100.00 

Заявление:

-- Table
CREATE TABLE #Items (
    [Year] int,
    [Value] numeric(20, 2)
)
INSERT INTO #Items 
    ([Year], [Value])
VALUES
    (2008, 100),
    (2009, 200),
    (2010, 300),
    (2011, 400),
    (2012, 500),
    (2013, 600),
    (2014, 700),
    (2015, 800),
    (2016, 900),
    (2017, 1000),
    (2018, 1100)

-- Statement
;WITH cte AS (
    -- Generate group numbers. Each group is every tree years.
    SELECT 
        [Year], 
        [Value], 
        (ROW_NUMBER() OVER (ORDER BY [Year]) - 1) / 3 AS GroupNumber,
        ROW_NUMBER() OVER (ORDER BY [Year]) AS RowNumber
    FROM #Items
), sums AS (
    -- Get total sums for each group
    SELECT 
        SUM([Value]) AS [SumValue], 
        GroupNumber, 
        ROW_NUMBER() OVER (ORDER BY GroupNumber) AS RowNumber
    FROM cte
    GROUP BY [GroupNumber]
)
-- Final SELECT 
SELECT cte.[Year], cte.[Value], sums.[SumValue]
FROM cte
LEFT JOIN sums ON (cte.RowNumber = sums.RowNumber)

Выход:

Year    Value   SumValue
2008    100.00  600.00
2009    200.00  1500.00
2010    300.00  2400.00
2011    400.00  2100.00
2012    500.00  NULL
2013    600.00  NULL
2014    700.00  NULL
2015    800.00  NULL
2016    900.00  NULL
2017    1000.00 NULL
2018    1100.00 NULL
0 голосов
/ 15 января 2019

Вы просто хотите lag()?

SELECT f.field_name, s.ticker AS Ticker_Name, 
       Year(st.date) AS YEAR, st.stock_id, st.field_id, 
       Sum(st.value) AS Value,
       LAG(Sum(st.value, 1)) OVER (PARTITION BY f.field_name, s.ticker, st.stock_id, st.field_id ORDER BY Year(st.date)) as year_1,
       LAG(Sum(st.value, 2)) OVER (PARTITION BY f.field_name, s.ticker, st.stock_id, st.field_id ORDER BY Year(st.date)) as year_2,
       LAG(Sum(st.value, 3)) OVER (PARTITION BY f.field_name, s.ticker, st.stock_id, st.field_id ORDER BY Year(st.date)) as year_3
FROM field_table f INNER JOIN
     stock_transaction st
     ON f.id = st.field_id INNER JOIN
     stocks s 
     ON s.id = st.stock_id 
WHERE s.id = 230 AND st.field_id = 29 
GROUP BY Year(st.date), s.ticker, st.stock_id, st.field_id, f.field_name; 

Обратите внимание, что я также заменил псевдонимы таблиц сокращениями для таблиц.Вы должны использовать значимые псевдонимы таблиц, такие как сокращения, а не произвольные буквы.

...