SQL GROUP BY 子句中的表达式或列

SQL expression or columns in the GROUP BY clause

这更像是理论问题而不是问题。假设我有一个 table,其中包含三列 id, Country1, Country2

我要运行简单示例查询:

SELECT 
     CASE WHEN Country1 = '' THEN Country2 ELSE Country1 END AS [Country], 
     COUNT(id) AS [Countries_count]
FROM ExampleTable
GROUP BY 
     CASE WHEN Country1 = '' THEN Country2 ELSE Country1 END

无论我是否放入整个非聚合表达式,查询都将有效

GROUP BY 
     CASE WHEN Country1 = '' THEN Country2 ELSE Country1 END

或仅此表达式中的列

GROUP BY 
     Country1,
     Country2

GROUP BY 子句中。

我应该将每个非聚合表达式(有时非常大)放入 GROUP BY 子句中,还是可以只放入这些表达式中的列?如果我 can/cannot,为什么?

你问的是以下哪个更适合查询:

GROUP BY CASE WHEN Country1 = '' THEN Country2 ELSE Country1 END

GROUP BY Country1, Country2

答案通常是第一个。但是,这取决于你想做什么。

考虑以下数据:

ID       Country1       Country2
 1                             A
 2              A              A
 3              A

这个查询:

SELECT (CASE WHEN Country1 = '' THEN Country2 ELSE Country1 END) AS [Country], 
       COUNT(id) AS [Countries_count]
FROM ExampleTable
GROUP BY (CASE WHEN Country1 = '' THEN Country2 ELSE Country1 END)

Returns一行总计数

A    3

这个版本

SELECT (CASE WHEN Country1 = '' THEN Country2 ELSE Country1 END) AS [Country], 
       COUNT(id) AS [Countries_count]
FROM ExampleTable
GROUP BY Country1, Country2

Returns三行:

A    1
A    1
A    1

在大多数情况下,我希望一行的计数为 3。在某些情况下,这可能是所需的输出。