【问题标题】:How to get sum of first three rows then next three rows in a new column如何获得前三行的总和,然后是新列中的下三行
【发布时间】:2019-01-15 10:51:17
【问题描述】:

你好,我有一个 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; 

我还附上了我的输出。

我的输出是年销售额的总和。现在我的任务是我必须在新列中显示三行的总和。例如: 2008 , 2009 , 2010 ,然后是 2011 , 2012 , 2013 的总和。然后是 2014 年,2015 年,2016 年

我的愿望输出是

任何人都可以建议我如何实现这一点。提前谢谢

【问题讨论】:

  • 您使用的是哪个版本的 SQL Server?
  • to create a Minimal, Complete, and Verifiable example 来强制人们处理您的自定义架构怎么样?
  • 我正在使用 sql server 2016
  • @Roy 。 . .请编辑您的问题并显示您想要的结果。示例数据也有帮助。
  • 我已经编辑了我的问题并附上了我想要得到的结果。

标签: sql sql-server ssms sql-server-2016


【解决方案1】:

你只想要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; 

请注意,我还将表格别名替换为表格的缩写。您应该使用有意义的表别名——例如缩写词——而不是任意字母。

【讨论】:

    【解决方案2】:

    这个答案只是一个基本示例,它演示了如何将每三行的值相加为结果集中的一个新列。您可以更改此设置以满足您的需求。示例使用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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-23
      • 1970-01-01
      • 2020-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多