SQL根据日期将SUM拆分为列

时间:2018-02-08 02:33:33

标签: sql sql-server

我正在尝试根据日期将值汇总到列中。

这是我当前的SQL

NSString *basePath = [NSTemporaryDirectory() stringByAppendingPathComponent:@"dirName"];
NSString *indexHtmlPath = [basePath stringByAppendingPathComponent:@"index.html"];
NSString *htmlString = [NSString stringWithContentsOfFile:indexHtmlPath encoding:NSUTF8StringEncoding error:nil];
NSURL *baseURL = [NSURL fileURLWithPath:basePath];
[self.wkWebView loadHTMLString:htmlString baseURL:baseURL];

此查询返回此结果集:

SELECT DISTINCT 
    FORMAT(dbo.DR_INVLINES.TRANSDATE, 'MMM') AS Month, 
    dbo.DR_ACCS.NAME, 
    SUM(dbo.DR_INVLINES.QUANTITY * dbo.STOCK_ITEMS.X_LITERAGE) AS SUMQTY, 
    FORMAT(dbo.DR_INVLINES.TRANSDATE, 'yy') AS Year
FROM
    dbo.DR_INVLINES 
INNER JOIN
    dbo.DR_TRANS ON dbo.DR_INVLINES.HDR_SEQNO = dbo.DR_TRANS.SEQNO 
INNER JOIN
    dbo.STOCK_ITEMS ON dbo.DR_INVLINES.STOCKCODE = dbo.STOCK_ITEMS.STOCKCODE  
INNER JOIN
    dbo.DR_ACCS ON dbo.DR_INVLINES.ACCNO = dbo.DR_ACCS.ACCNO
GROUP BY 
    FORMAT(dbo.DR_INVLINES.TRANSDATE, 'yy'), 
    FORMAT(dbo.DR_INVLINES.TRANSDATE, 'MMM'), 
    dbo.STOCK_ITEMS.STOCKGROUP, dbo.DR_ACCS.NAME
HAVING        
    (dbo.STOCK_ITEMS.STOCKGROUP = 3)

我想要实现的是

Mth Name       SUMQTY   Year
-----------------------------
Apr Company 1    1000   16
Apr Company 2   30790.4 16
Apr Company 3    1840   16
Apr Company 1    6502.9 17
Apr Company 2    2000   17
Apr Company 3    1000   17

有人可以帮忙解决这个问题......我在这个问题上多年来一直在绞尽脑汁; - )

2 个答案:

答案 0 :(得分:0)

您是否尝试过group by

SELECT FORMAT(il.TRANSDATE, 'MMM') AS Month, a.NAME, 
       SUM(CASE WHEN year(il.TRANSDATE) = 2016 THEN anil.QUANTITY * si.X_LITERAGE END) AS SUMQTY_2017, 
       SUM(CASE WHEN year(il.TRANSDATE) = 2017 THEN anil.QUANTITY * si.X_LITERAGE END) AS SUMQTY_2016 
FROM dbo.DR_INVLINES il INNER JOIN
     dbo.DR_TRANS t
     ON il.HDR_SEQNO = t.SEQNO INNER JOIN
     dbo.STOCK_ITEMS si
     ON il.STOCKCODE = si.STOCKCODE INNER JOIN
     dbo.DR_ACCS a
     ON il.ACCNO = a.ACCNO
WHERE si.STOCKGROUP = 3
GROUP BY FORMAT(il.TRANSDATE, 'MMM'), a.NAME;

请注意更改:

  • 表别名使查询更易于编写和阅读。
  • having子句位于未聚合列上,因此它应该是where子句。
  • group by
  • 中有一个额外的列
  • 我建议使用datepart()datename()而不是format()

答案 1 :(得分:0)

如果我理解您的问题,您希望将YEAR显示为列,

SELECT  FORMAT(dbo.DR_INVLINES.TRANSDATE, 'MMM') AS Month, 
        dbo.DR_ACCS.NAME, 
        SUM(CASE WHEN YEAR(dbo.DR_INVLINES.TRANSDATE) = 2016 
                THEN dbo.DR_INVLINES.QUANTITY * dbo.STOCK_ITEMS.X_LITERAGE
                ELSE 0
                END ) AS [2016], 
        SUM(CASE WHEN YEAR(dbo.DR_INVLINES.TRANSDATE) = 2017 
                THEN dbo.DR_INVLINES.QUANTITY * dbo.STOCK_ITEMS.X_LITERAGE
                ELSE 0
                END ) AS [2017]
FROM    dbo.DR_INVLINES 
        INNER JOIN dbo.DR_TRANS 
            ON dbo.DR_INVLINES.HDR_SEQNO = dbo.DR_TRANS.SEQNO 
        INNER JOIN dbo.STOCK_ITEMS 
            ON dbo.DR_INVLINES.STOCKCODE = dbo.STOCK_ITEMS.STOCKCODE 
        INNER JOIN dbo.DR_ACCS 
            ON dbo.DR_INVLINES.ACCNO = dbo.DR_ACCS.ACCNO
WHERE   dbo.STOCK_ITEMS.STOCKGROUP = 3
GROUP   BY FORMAT(dbo.DR_INVLINES.TRANSDATE, 'yy'), 
        FORMAT(dbo.DR_INVLINES.TRANSDATE, 'MMM'), 
        dbo.STOCK_ITEMS.STOCKGROUP, 
        dbo.DR_ACCS.NAME