В идеале мне нужны ответы, совместимые с SQL2008, из-за ограничений клиента.
Мне нужен отдельный список элементов, но со столбцом, который возвращает определенный фрагмент данных если, исходные данные изначально имели только один элемент...
Пример данных...
Id Code
1 A
2 A
3 B
В приведенном выше примере данных я хочу вернуть отдельный список Code
, но если существует только один экземпляр этого кода, я хочу, чтобы Id
был возвращен (в противном случае null
)
Ожидаемый результат...
Code Id
A null
B 3
У меня есть следующее, но мне кажется, что должен быть более простой способ сделать это, возможно, с помощью GROUP BY
...
; WITH Data AS (
SELECT Code, Id ROW_NUMBER() OVER (PARTITION BY Code ORDER BY Id) AS RowNum
FROM MyTable
)
SELECT D1.Code, CASE (SELECT COUNT(*) FROM Data D2 WHERE D2.Code = D1.Code) WHEN 1 THEN D1.Id ELSE NULL END
FROM Data D1
WHERE D1.RowNum = 1
Можно ли это сделать лучше?
@larnu - поговори с моим клиентом
Я не могу, @freefaller, но ты можешь.
Ваше заявление о том, что я буду разговаривать с вашим клиентом не было, "глупое"? Я не знаю, кто вы и кто ваш покупатель; Разумный ответ на такую глупую просьбу — сказать тебе, что я не могу, @Freefaller. Если вы имеете в виду, что заявление о том, что SQL Server 2008 полностью не поддерживается, глупо, то это не так. SQL Server 2008 не имел обновлений Любые почти 3 года и, безусловно, имеет известные уязвимости безопасности, которые не будут исправлены; это не глупость, это забота.
Агрегация приходит на ум здесь:
SELECT Code, CASE WHEN COUNT(*) = 1 THEN MAX(Id) END AS Id
FROM MyTable
GROUP BY Code;
Аргх, как просто! Спасибо @Тим
Обязательное замечание, что SQL Server 2008 полностью не поддерживается уже почти 3 года; давно пора вам разобраться в пути обновления.