2016-01-26 4 views
0

Мой SQL пример выглядит следующим образом ...Как GROUP BY с оператором CASE?

DECLARE @a TABLE(
    id INT, 
    val BIT 
); 
INSERT INTO @a(id,val) VALUES (1,0),(2,0),(3,1),(4,0),(5,1); 

SELECT 
    id = CASE 
     WHEN val = 1 THEN id 
     ELSE MAX(id) 
    END 
FROM @a 
WHERE val = 0 
GROUP BY id, val; 

Что мой результат:

id 
--- 
1 
2 
4 

То, что я пытаюсь получить ...

id 
--- 
4 

Или если бы я сделал «WHERE val = 1», тогда я хочу ...

id 
--- 
3 
5 

То, что я в основном пытаюсь сказать, это «если я выбираю, где val = 1, я хочу все строки, но если я выберу, где val = 0, мне нужна только строка с самым высоким id». Есть идеи?

+1

Не уверен, что вы здесь делаете. Почему существует только 1 строка, когда val = 0, но вы хотите, чтобы оба, когда val = 1 ??? Это не имеет никакого смысла. –

+0

То, что я в основном пытаюсь сказать, это «если val = 1, я хочу все строки, но если val = 0, мне нужна только строка с самым высоким id». Я расскажу об этом в своем вопросе, спасибо. – felloffthestack

+0

Я думаю, что вы упростили свой пример так, чтобы он больше не представлял проблему. –

ответ

2

Я не уверен, что понимаю, что вы пытаетесь сделать, но следующий запрос дает ожидаемый результат с WHERE val = 1 или WHERE val = 0. Идея состоит в том, чтобы переместить корпус в пункт GROUP BY

SELECT MAX(id) 
FROM @a 
WHERE val = 1 
GROUP BY CASE WHEN val = 1 THEN id ELSE 0 END 
+0

Это действительно любопытное решение, и мне это очень нравится. Спасибо! – felloffthestack

+0

@felloffthestack Я бы пошел с этим – JamieD77

0

Вы можете использовать оператор UNION для объединения таблиц. Так что, если мы разделимся, что вы хотите сделать в два отдельных заявления, которые мы получаем следующее, если WHERE = 0

SELECT MAX(id) 
FROM @a 
GROUP BY ID, VAL 

UNION 

SELECT ID 
FROM @a 
WHERE val = 0 AND val = 1 
GROUP BY ID, VAL 

И следующее, если WHERE = 1

SELECT MAX(id) 
FROM @a 
GROUP BY ID, VAL 

UNION 

SELECT ID 
FROM @a 
WHERE val = 1 AND val = 1 
GROUP BY ID, VAL 

Это может ясно почему изменение предложения where, чтобы оно делало что-то другое, кажется мне странным. Очевидно, что в первой части после объединения глупо/бесполезно. Во 2-м тоже кажется странным иметь одно и то же выражение дважды в предложении where. Но это отвечает вашим требованиям, чтобы изменить одно значение в месте и иметь два разных результата.

Возможно, вы сможете лучше объяснить свои требования теперь, когда увидите решение?

+0

Извините, я все еще не уверен, что объясняю это так четко, как должен, но @ JamieD77 нашел решение, которое я искал. – felloffthestack

Смежные вопросы