2014-11-05 3 views
0

Я пытаюсь выяснить все записи, которые имеют только значение null в двух столбцах. Проблема я бегу в том, чтоПоказаны случаи DISTINCT, где NULL

У меня есть 565 строк с Columns включая ID, Allegation1, утверждение 2, дата, concatenatedalleg12 так он показывает, как

ID ALLEG1 ALLEG2 DATE CONCATENATED 
1  NULL  NULL  DATE1 NULL 
1  NULL  A1  DATE1 A1 
1  A2  NULL  DATE1 A2 
2  NULL  NULL  DATE2 NULL 
2  NULL  B1  DATE2 B2 
3  NULL  NULL  DATE3 NULL 
4  NULL  NULL  DATE4 NULL 
5  NULL  NULL  DATE5 NULL 
5  NULL  C1  DATE5 C1  

Я хочу показать только:

ID ALLEG1 ALLEG2 DATE CONCATENATED 
3  NULL  NULL  DATE3 NULL 
4  NULL  NULL  DATE4 NULL 

Как получить только отдельные случаи, когда имеется только одна строка с нулями без включения строк 1 2 и 5 нулей, которые также имеют ненулевые 2+ строки.

+0

Просто быть конкретными: Какие СУБД вы используете? – Barranka

+0

Я использую Microsoft Server Management Studio @barranka –

+0

oh Я вижу ... вы хотите те, где есть только одна строка с нулями? – Hogan

ответ

0
SELECT 
    ID, 
    MAX(ALLEG1) AS ALLEG1, 
    MAX(ALLEG2) AS ALLEG2, 
    MAX([DATE]) AS [DATE], 
    MAX(CONCATENATED) AS CONCATENATED 
FROM 
    @TBL 
GROUP BY 
    ID 
HAVING 
    SUM(CASE WHEN ALLEG1 IS NULL THEN 0 ELSE 1 END + CASE WHEN ALLEG2 IS NULL THEN 0 ELSE 1 END) = 0 
+1

Проще говоря, выражение 'has' просто:' с max (alleg1) null и max (alleg2) имеет значение null. –

+0

Да. Но с формулой может быть легко создана более сложная условная формула, например, когда ALLEG2 в ('val1', 'val2'), затем 0 else 1 заканчивается, обеспечивая некоторую дополнительную универсальность в критериях решения. –

3
WITH idswithonerow AS 
(
    SELECT ID FROM 
    (
     SELECT ID, 
      COUNT() OVER (PARTITION BY ID) AS CN 
     FROM tablename 
    ) as tmp 
    WHERE CN = 1 
) 
    select ID, ALLEG1, ALLEG2, DATE, CONCATINATED 
    FROM tablename 
    WHERE ALLEG11 is null and ALLEG2 is null 
    AND ID IN SELECT ID FROM idswithonerow 
+1

@ rvphx - Проверьте это: http://msdn.microsoft.com/en-us/library/ms189461.aspx – Hogan

+0

@Hogan, Я ПОЛУЧИЛ ЭТИ ОШИБКИ: Msg 174, уровень 15, состояние 1, строка 6 COUNT функция требует 1 аргумент (ы). Msg 156, Level 15, State 1, Line 42 Неверный синтаксис рядом с ключевым словом «SELECT». –

+0

@hvd, попробовав свой метод: Msg 8156, Level 16, State 1, Line 20 Столбец INCNUM был указан несколько раз для 'sub'. –

0

Учитывая, что вам нужно только, чтобы показать NULL местоблюстителем, вы могли бы сделать что-то вроде этого:

select ID 
    , null as ALLEG1 
    , null as ALLEG2 
    , DATE 
    , null as CONCATENATED 
from yourTable 
where ALLEG1 is null and ALLEG2 is null 
group by ID, DATE; 

конечно, если вы можете просто игнорировать эти столбцы, вещи становятся проще:

select ID 
    , DATE 
from yourTable 
where ALLEG1 is null and ALLEG2 is null 
group by ID, DATE; 

Тогда вы можете иметь дело с теми, необходимыми столбцами в переднем конце

+0

Это даст неправильные результаты. Когда вы делаете max, скажем, для ID 1, он будет выбирать Alleg2 как 1 (поскольку вторая строка в наборе данных имеет значение). – rvphx

+0

@rvphx отредактировал, спасибо (я думал о чем-то и писал что-то еще ... duh, чертовски картофельные чипсы, они испортили мой мозг) – Barranka

0

Попробуйте использовать этот запрос

select * 
from xxx 
where ((ALLEG1 is not null) and (ALLEG2 is null) and (DATE is null) and (CONCATENATED is null)) 
or 
((ALLEG1 is null) and (ALLEG2 is not null) and (DATE is null) and (CONCATENATED is null)) 
or 
((ALLEG1 is null) and (ALLEG2 is null) and (DATE is not null) and (CONCATENATED is null)) 
or 
((ALLEG1 is null) and (ALLEG2 is null) and (DATE is null) and (CONCATENATED is not null)) 


having count(id)=1 
Смежные вопросы