2015-04-17 63 views
0

这更像是理论问题而不是问题。假设我有一张有三列id, Country1, Country2的表格。SQL表达式或GROUP BY子句中的列

我想运行简单的例子查询:

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子句中的每个非聚集表达式(有时真的很庞大)或我只能从这些表达式中放置列?如果我能/不能,为什么?

+1

哪个dbms? (不完全符合ANSI/ISO标准。)列employment_date的数据类型? (由于您检查了employment_date =''...) – jarlh

+0

在** SQL Server **中,每个非聚合列**必须在** GROUP BY列列表中。其他RDBMS可能允许不同的方法。 –

+0

那么,好点 - 日期的例子并不是最好的选择。我改变它以避免数据类型offtopic ;-) – Iver

回答

2

你问它的这些更适合查询:

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) 

返回与整体计数

A 3 

这个版本一行

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

返回三行:

A 1 
A 1 
A 1 

在大多数情况下,我想一个行与3计数可能会有一些情况,其中这是所需的输出。