2016-10-07 3 views
0

У меня есть таблица, которая содержит поле, которое используется для группировки, и другое поле, в котором хранятся данные. Мне нужен хороший способ найти значение GroupColumn, где каждое значение DataColumn содержит определенное значение.TSQL Найти, если все записи в группе имеют одинаковое значение

Пример

+-------------+------------+ 
| GroupColumn | DataColumn | 
+-------------+------------+ 
| GroupA  | Data1  | 
| GroupA  | Data2  | 
| GroupA  | Data3  | 
| GroupB  | Data1  |<---These two values are the same 
| GroupB  | Data1  |<---for the same group 
| GroupC  | Data1  | 
| GroupC  | Data2  | 
| GroupC  | Data2  | 
| GroupC  | Data3  | 
+-------------+------------+ 

Желаемая Выход

Группа B

В приведенном выше примере изменения DataColumn для GroupA и GroupC, но для GroupB оба значения в DataColumn являются так что я бы хотел, чтобы этот результат вернулся.

Текущее решение

У меня 2 текущие решения, основанные вокруг одной и той же теме, но я чувствую, что это то, что SQL должен быть в состоянии сделать в более легкой форме.

  1. Сгруппируйте все в таблице, подсчитайте время появления GroupColumn и поместите его в таблицу. Сделайте то же самое, но примените условие. Присоединитесь к двум таблицам и посмотрите, где не совпадают 2 счета.

    SELECT GROUPCOLUMN, COUNT(*) [TOTAL] INTO #ALL 
    FROM #TABLE 
    GROUP BY GROUPCOLUMN 
    
    SELECT GROUPCOLUMN, COUNT(*) [TOTAL] INTO #SOME 
    FROM #TABLE 
    WHERE DATACOLUMN = 'DATA1' 
    GROUP BY GROUPCOLUMN 
    
    SELECT * FROM #ALL A 
    INNER JOIN #SOME S ON A.GROUPCOLUMN = S.GROUPCOLUMN 
    WHERE S.TOTAL = A.TOTAL 
    
  2. Используйте SUM и случай для проверки конкретного значения и сосчитать все и проверить в суб-запроса.

    SELECT * FROM 
    (SELECT GROUPCOLUMN, SUM(CASE WHEN DATACOLUMN = 'DATA1' THEN 1 ELSE 0 END) [VALUE], COUNT(*) [TOTAL] FROM #TABLE (NOLOCK) 
    GROUP BY GROUPCOLUMN) A 
    WHERE A.VALUE = A.TOTAL 
    

Есть ли лучший способ сделать это в SQL?

Заранее спасибо.

Ninja

ответ

1

Вы ищете HAVING п

SELECT GROUPCOLUMN 
FROM #TABLE (NOLOCK) 
GROUP BY GROUPCOLUMN 
HAVING Count(*) = Count(case when DATACOLUMN = 'DATA1' then 1 end) 
+0

Так просто и при этом так эффективно! Большое спасибо @Prdp. – Ninja

0

Вы должны быть в состоянии сравнить COUNT(*) с COUNT(DISTINCT DATACOLUMN) сделать это. Например:

SELECT GROUPCOLUMN 
FROM #TABLE 
GROUP BY GROUPCOLUMN 
HAVING Count(*) = Count(DISTINCT DATACOLUMN) 
+0

Но он проверяет только на '' DATA1'' –

+0

пример sql использует это значение, но в тексте вопроса указывается только «конкретное значение». Не будучи уверенным в этом требовании, я бы предпочел более гибкое и обобщенное решение. – SlimsGhost

+0

Согласовано .......... –