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;