Как выбрать только общие свойства из набора результатов? - PullRequest
2 голосов
/ 29 мая 2009

Допустим, у меня есть таблица с такими столбцами, как:

  • ID
  • Name
  • City
  • State
  • ZIP

Мне нужно написать запрос, который будет возвращать только одну строку. Эта строка будет включать City, State и ZIP, но я хочу, чтобы поле имело значение, только если все значения в наборе результатов совпадают, в противном случае я хочу, чтобы поле было null.

Например, если каждая запись имеет одно и то же состояние, то в результате будет возвращено состояние. Если только один результатов имеет другое состояние, я хочу, чтобы поле было null. Возможно ли что-то подобное в SQL Server 2005?

В принципе, я хочу запрос, подобный этому:

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

Но верните только одну строку со спецификациями, которые я описал выше.

Ответы [ 2 ]

6 голосов
/ 29 мая 2009
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)
2 голосов
/ 29 мая 2009

Если столбцы не имеют значения NULL или если вы хотите игнорировать NULL, тогда ответ gbn верен. Однако, если вам нужно обрабатывать нулевые значения как разные значения, попробуйте это:

CASE WHEN COUNT(DISTINCT city) = 1 
      AND COUNT(city) = COUNT(*) 
     THEN MAX(city) ELSE NULL END AS city
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...