SQL Server 2008 与分组和大小写。分组方式不起作用

Posted

技术标签:

【中文标题】SQL Server 2008 与分组和大小写。分组方式不起作用【英文标题】:SQL Server 2008 with group by and case. Group by is not working 【发布时间】:2022-01-24 05:51:02 【问题描述】:

有人可以帮我解决group by的问题

我有这个 SQL 代码(在 SQL Server 2008 中)

SELECT DISTINCT
    '2' AS report,
    DepartmentName,
    CASE 
        WHEN @GroupBy = 'Division' THEN DivisionName
        WHEN @GroupBy = 'Department' THEN '' 
    END AS DivisionName,
    Rank,
    CASE 
        WHEN DivisionName = '' THEN NULL 
        ELSE AVG(Amount) 
    END AS Amount,
FROM
    #Report
GROUP BY
    DepartmentName,
    DivisionName,
    Rank

它不是按部门分组(我得到 3 个 Category1,因为它们属于 3 个不同的部门)。你知道为什么吗?

2   Group   0   Category1
2   Group   0   Category1               
2   Group   0   Category1               
2   Group   0   Category2               
2   Group   0   Category3                   
2   Group   0   Category4       
2   Group   0   Category15  

提前非常感谢!

【问题讨论】:

SQL Server 2008 和 2008 R2 在几年前就已终止使用,现在完全不受支持。您真的应该考虑升级到受支持的版本。 我的公司仍然拥有它... 请向minimal reproducible example 提供样本数据以支持您想要的结果。而且我建议将group bydistinct 结合起来会让人感到困惑和自找麻烦。 仅供参考,当您按DivisionName 分组时,它是按原始列而不是别名分组。 通常在使用条件聚合时,您会用聚合函数包围 整个 CASE 表达式,而不仅仅是 WHEN 中的表达式。 【参考方案1】:

事实是,如果我们看不到源数据,我们就无法回答。我敢猜测这是戴尔在 cmets 中提到的:

如果您的 3 Category1 在原始表中有不同的[DivisionName]s,它们将作为单独的行返回。 Group Byselect 之前“执行”,因此如果您想根据计算建立新数据,您应该在派生表中进行:

SELECT 
    '2' AS report,
    DepartmentName,
    derived_table.DivisionName, -- alias added
    Rank,
    CASE 
        WHEN derived_table.DivisionName = '' THEN NULL 
        ELSE AVG(Amount) 
    END AS Amount,
FROM
    #Report
    cross apply
    (
        select  CASE 
                    WHEN @GroupBy = 'Division' THEN DivisionName
                    WHEN @GroupBy = 'Department' THEN '' 
                END AS DivisionName
    ) as derived_table
GROUP BY
    DepartmentName,
    derived_table.DivisionName,
    Rank

【讨论】:

以上是关于SQL Server 2008 与分组和大小写。分组方式不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 sql server 2008 的同一张表中使用计数和分组方式和自连接?

在 SQL Server 2008 R2 中对多行进行分组

SQL Query (SQL Server 2008) 从两个表中检索数据并对结果进行分组

SQL Server 2008 如何对分组进行小计

sqlserver2008,sql编程,group by 用法

sqlserver2008,sql编程,group by 用法