2013-02-24 2 views
0

Учитывая таблицу, т:Определение столбцов с различными значениями для каждого набора столбцов

a  b c  d  e 
1  2 3  4  7 
1  2 3  5  7 
3  2 4  6  7 
3  2 4  6  8 

Что SQL запроса может идентифицировать столбцы, имеет один или несколько экземпляров различных значений, связанных с каждым кортежем из столбцов a и b,?

В таблице т выше, столбцы д и е будет удовлетворять этому критерию, но не столбец с.

для кортежей < 1,2> и < 3,2> которые приходят из колонн и б, колонка с не имеют различные значения для каждого кортежа.

Колонка д имеет один экземпляр для изменения значения кортежа < 1,2> - значения 4 и 5.

Колонка е также имеет один экземпляр для различных значений кортежа < 3,2> - значения 7 и 8.

+0

Какие СУБД вы используете? – sgeddes

+0

Я использую Oracle –

ответ

2

Что-то, как это должно работать для вас с помощью CASE, COUNT и GROUP BY:

select 
    a, b, 
    case when count(distinct c) > 1 then 'yes' else 'no' end colc, 
    case when count(distinct d) > 1 then 'yes' else 'no' end cold, 
    case when count(distinct e) > 1 then 'yes' else 'no' end cole 
from t 
group by a, b 

SQL Fiddle Demo

0

Слегка косвенно:

SELECT a, b, 
     COUNT(DISTINCT c) AS num_c, 
     COUNT(DISTINCT d) AS num_d, 
     COUNT(DISTINCT e) AS num_e 
    FROM t 
GROUP BY a, b; 

Это дает:

1 2 1 2 1 
3 2 1 1 2 

Если столбец num_c или num_d или num_e имеет значение, большее, чем 1, то есть различные значения. Вы можете изменить запрос, чтобы перечислить ли столбец различной для заданного значения (а, б) с помощью сазе так:

-- v for varying, n for non-varying 
SELECT a, b, 
     CASE WHEN COUNT(DISTINCT C) > 1 THEN 'v' ELSE 'n' END AS num_c, 
     CASE WHEN COUNT(DISTINCT d) > 1 THEN 'v' ELSE 'n' END AS num_d, 
     CASE WHEN COUNT(DISTINCT e) > 1 THEN 'v' ELSE 'n' END AS num_e 
    FROM t 
GROUP BY a, b; 

Это дает:

1 2 n v n 
3 2 n n v 

Если вы действительно хотите знать, не меняется ли какой-либо набор значений в данном столбце для любых значений (a, b), а не для каких значений (a, b), для которых он варьируется: вы можете использовать указанный выше запрос в качестве подзапроса в предложение FROM и упорядочивать вещи по вашему желанию.

SELECT MAX(num_c) AS num_c, 
     MAX(num_d) AS num_d, 
     MAX(num_e) AS num_e 
    FROM (SELECT a, b, 
       CASE WHEN COUNT(DISTINCT C) > 1 THEN 'v' ELSE 'n' END AS num_c, 
       CASE WHEN COUNT(DISTINCT d) > 1 THEN 'v' ELSE 'n' END AS num_d, 
       CASE WHEN COUNT(DISTINCT e) > 1 THEN 'v' ELSE 'n' END AS num_e 
      FROM t 
     GROUP BY a, b 
     ); 

Это зависит от v будучи больше, чем n; это достаточно просто (и достаточно удобно) для этого двоичного решения, но не обязательно удобно или легко, если есть, скажем, 4 состояния для отображения.

Это дает:

n v v 
+0

Спасибо большое! Последний запрос - это то, что мне нужно. –

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