SQL-每行使用多维数据集总计
这是我的密码:SQL-每行使用多维数据集总计,sql,sql-server,Sql,Sql Server,这是我的密码: SELECT ISNULL (CONVERT(VARCHAR, MONTH(PurchaseDate)), NULL) [Month], ISNULL (Brand, CASE WHEN MONTH(PurchaseDate) IS NOT NULL THEN 'Monthly SubTotal' WHEN Brand IS NULL THEN 'Grand Total'
SELECT
ISNULL (CONVERT(VARCHAR, MONTH(PurchaseDate)), NULL) [Month],
ISNULL (Brand, CASE
WHEN MONTH(PurchaseDate) IS NOT NULL THEN 'Monthly SubTotal'
WHEN Brand IS NULL THEN 'Grand Total'
ELSE 'N/A'
END) [Brand], SUM(Price) [Total Amount]
FROM
[dbo].[Purchase_Items]
GROUP BY
MONTH(PurchaseDate), Brand WITH CUBE
我想在所选框中将其更改为总计。如何对其进行编码或更改其上的字符串。如果您首先获取数据(上述数据的更简单版本),则可以将其用作数据源,根据需要进行转换/更新 我在这里使用CTE,但您也可以使用子查询
WITH MonthTotals AS
(SELECT
MONTH(PurchaseDate) [Month],
[Brand],
SUM(Price) [Total Amount]
FROM [dbo].[Purchase_Items]
GROUP BY MONTH(PurchaseDate), Brand WITH CUBE
)
SELECT CONVERT(VARCHAR(2), mt.[Month]) AS [Month],
CASE WHEN mt.[Month] IS NULL AND mt.[Brand] IS NULL THEN 'Grand Total'
WHEN mt.[Month] IS NULL THEN 'Grand total for ' + mt.[Brand]
WHEN mt.[Brand] IS NULL THEN 'Monthly total'
ELSE mt.[Brand] END AS [Brand]
[Total Amount]
FROM MonthTotals mt;
请注意,尽管多维数据集通常是在SQL Server中完成的,如下所示-这意味着您可以选择多维数据集所依据的列(或汇总,等等)
重要更新以下是@MartinSmith的评论 Martin Smith建议我应该使用
分组
功能。在回顾该函数时,他是100%正确的(感谢Martin,这是我今天学到的东西)
作为参考,分组函数(使用1或0)指示该行是否为聚合行(例如,由汇总/多维数据集/分组集添加的一行)
我在几个月的小计中也犯了一个错误——把它放在了错误的栏中
因此,更新内容应如下所示(同时请注意,我还包括了来自多维数据集的月份和品牌的“原始”淡水河谷)
您可以编辑其他成员最近所做的改进。如果你检查编辑历史记录,你会看到他们是如何做的。每个品牌的总数已经计算出来了,例如:苹果:170000+70000+170000=410000你能解释一下遗漏了哪些计算吗?此外,为了从您的问题中获得最佳结果,请提供“样本数据”和“预期结果”(但不作为图像)。建议您查看页脚中的帮助链接,了解如何设置格式以及如何最好地提问questions@Used_By_Already是的,每个品牌的总数已经计算出来了,但是我想更改每个品牌总数上的字符串。例如,苹果的总数,我想将字符串值“Apple”更改为“Grand total For Apple”。我认为使用多维数据集的
是不可取的。我的问题已经解决了,非常感谢您提供的代码。对于最后一个问题,我如何取回“每月小计”?您可以在CASE表达式中添加另一行-我将用额外的行更新答案。您应该使用分组
函数我不知道@Martin这个函数,但在阅读相关内容后,我完全同意应该使用它。因此,感谢您提供的非常有用的反馈。我的答案已适当更新。
GROUP BY CUBE(MONTH(PurchaseDate), Brand)
WITH MonthTotals AS
(SELECT
MONTH(PurchaseDate) [Month],
[Brand],
SUM(Price) [Total Amount],
GROUPING(MONTH(PurchaseDate)) AS Agg_flag_Month,
GROUPING([Brand]) AS Agg_flag_Brand
FROM [dbo].[Purchase_Items]
GROUP BY CUBE(MONTH(PurchaseDate), Brand)
)
SELECT [Month] AS Orig_Month,
[Brand] AS Orig_Brand,
CASE WHEN Agg_flag_Month = 1 THEN 'Grand total for ' + mt.[Brand]
ELSE CONVERT(VARCHAR(2), mt.[Month])
END AS [Month],
CASE WHEN Agg_flag_Month * Agg_flag_Brand = 1 THEN 'Grand Total'
WHEN Agg_flag_Brand = 1 THEN 'Monthly total'
ELSE mt.[Brand]
END AS [Brand],
[Total Amount]
FROM MonthTotals mt;