如何仅从结果集中选择常用属性?

时间:2009-05-29 14:00:33

标签: sql sql-server sql-server-2005 tsql

假设我有一个包含以下列的表:

  • ID
  • Name
  • City
  • State
  • ZIP

我需要编写一个只返回一行的查询。此行将包含CityStateZIP,但如果结果集中的所有值都相同,我只希望字段具有值,否则我希望字段为是null

例如,如果每条记录都具有相同的状态,则State将返回结果。如果只有一个结果具有不同的状态,我希望该字段为null。在SQL Server 2005中是否可以这样?

基本上,我想要一个这样的查询:

SELECT City, State, ZIP
FROM Users
WHERE ID IN(1,2,3,4,5,6)

但是只返回一行,使用上面描述的规格。

2 个答案:

答案 0 :(得分:6)

SELECT
    CASE WHEN COUNT(DISTINCT city) = 1 THEN MAX(city) ELSE NULL END AS city,
    CASE WHEN COUNT(DISTINCT state) = 1 THEN MAX(state) ELSE NULL END AS state,
    CASE WHEN COUNT(DISTINCT zip) = 1 THEN MAX(zip) ELSE NULL END AS zip
FROM Users
WHERE ID IN(1,2,3,4,5,6)

其他回答后:

SELECT
    CASE WHEN COUNT(DISTINCT NULLIF(city,'**NULL**')) = 1 THEN MAX(city) ELSE NULL END AS city,
    CASE WHEN COUNT(DISTINCT NULLIF(state,'**NULL**')) = 1 THEN MAX(state) ELSE NULL END AS state,
    CASE WHEN COUNT(DISTINCT NULLIF(zip,'**NULL**')) = 1 THEN MAX(zip) ELSE NULL END AS zip
FROM Users
WHERE ID IN(1,2,3,4,5,6)

答案 1 :(得分:2)

如果列不可为空,或者如果要忽略空值,那么gbn的答案是正确的。但是,如果需要将空值视为不同的值,请尝试以下操作:

CASE WHEN COUNT(DISTINCT city) = 1 
      AND COUNT(city) = COUNT(*) 
     THEN MAX(city) ELSE NULL END AS city