我正在尝试添加一个' Total'每个唯一客户名称后面的行。我已经尝试过ROLLUP,但由于我尝试分组的字段数量似乎无法正常工作。我正在寻找的一个例子是伪的
( FlavorName(' Total'),2016Sales(总销售额总和),2017销售(总销售额总和),2016TotalPounds(总磅数),2017TotalPounds(总磅数总和))
请在下面找到我目前的代码。
WITH cte AS (SELECT CustName AS CustomerName, ItemKey AS CICode, Description AS FlavorName, CASE WHEN InvoiceDate BETWEEN '2016-01-01' AND
'2016-12-31' THEN SUM(LineNet) ELSE 0 END AS [2016TotalSales], CASE WHEN InvoiceDate BETWEEN '2017-01-01' AND getdate() THEN SUM(LineNet)
ELSE 0 END AS [2017TotalSales], CASE WHEN InvoiceDate BETWEEN '2016-01-01' AND '2016-12-31' THEN ROUND(SUM(QtyOrd), 2)
ELSE 0 END AS [2016TotalPounds], CASE WHEN InvoiceDate BETWEEN '2017-01-01' AND getdate() THEN ROUND(SUM(QtyOrd), 2)
ELSE 0 END AS [2017TotalPounds], BasePrice, SUBSTRING(CAST(InvoiceDate AS nvarchar(50)), 8, 5) AS year, UOM
FROM dbo.ABC
GROUP BY CustName, ItemKey, Description, BasePrice, InvoiceDate, UOM)
SELECT TOP (100) PERCENT CustomerName, CASE WHEN CICode IS NULL THEN 'ALL' ELSE CICode END AS CICode, CASE WHEN BasePrice IS NULL
THEN 'TOTALS' ELSE FlavorName END AS FlavorName, SUM([2016TotalSales]) AS [2016Sales], SUM([2017TotalSales]) AS [2017Sales], SUM([2016TotalPounds])
AS [2016TotalPounds], ROUND(SUM([2017TotalPounds]), 2) AS [2017TotalPounds], UOM, ISNULL(ROUND((SUM([2017TotalPounds]) - SUM([2016TotalPounds]))
/ NULLIF (SUM([2016TotalPounds]), 0) * 100, 2), 100) AS [%Change], BasePrice
FROM cte AS cte_1
GROUP BY CustomerName, CICode, FlavorName, BasePrice, UOM
HAVING (SUM([2016TotalSales]) + SUM([2017TotalSales]) > 0)
答案 0 :(得分:0)
尝试GROUPING SETS
:
GROUP BY GROUPING SETS ( (CustomerName, CICode, FlavorName, BasePrice, UOM), (CustomerName) )
您可能需要使用ORDER BY
来按照您想要的特定顺序获得结果。