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 by
与distinct
结合起来会让人感到困惑和自找麻烦。
仅供参考,当您按DivisionName
分组时,它是按原始列而不是别名分组。
通常在使用条件聚合时,您会用聚合函数包围 整个 CASE
表达式,而不仅仅是 WHEN
中的表达式。
【参考方案1】:
事实是,如果我们看不到源数据,我们就无法回答。我敢猜测这是戴尔在 cmets 中提到的:
如果您的 3 Category1 在原始表中有不同的[DivisionName]
s,它们将作为单独的行返回。 Group By
在 select
之前“执行”,因此如果您想根据计算建立新数据,您应该在派生表中进行:
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 Query (SQL Server 2008) 从两个表中检索数据并对结果进行分组