Условный GROUP BY и дополнительные столбцы? - PullRequest
0 голосов
/ 08 ноября 2011
Insert into x (...)
select a,b,c from prq where p_a is null group by a,b,c

Теперь мое требование состоит в том, чтобы, если p_a is null, то мне пришлось сгруппировать по a, b, c и выбрать только столбцы a, b, c.

Но если p_a is not null, тогда я должен сгруппировать по двум новым столбцам x, y, а также выбрать эти два столбца. Эти столбцы x, y имеют значение NULLABLE в таблице x.

Ответы [ 2 ]

2 голосов
/ 08 ноября 2011

В таблице X должно быть не менее пяти столбцов, имена которых, как мы можем предположить, являются a, b, c, x, y.

Если вы делаете одну ВСТАВКУ, то вам нужно вставить ее во все пять столбцов. Если вы выполняете несколько операций INSERT, вы можете вставить в 3, а затем 5 (или наоборот) столбцов. Возможно, вам придется выполнить некоторые манипуляции со значениями NULL в списке выбора первой альтернативы. Я предполагаю, что столбцы x и y являются INTEGER для определенности - выберите подходящий тип.

1-ая альтернатива

INSERT INTO x(a, b, c, x, y)
    SELECT a, b, c, MAX(CAST(NULL AS INTEGER)) AS x, MAX(CAST(NULL AS INTEGER)) AS y
      FROM pqr
     WHERE p_a IS NULL
     GROUP BY a, b, c
    UNION
    SELECT MAX(a) AS a, MAX(b) AS b, MAX(c) AS c, x, y
      FROM pqr
     WHERE p_a IS NOT NULL
     GROUP BY x, y;

Вы можете заменить предложение GROUP BY a, b, c на DISTINCT перед a в списке выбора первой части UNION. В большинстве СУБД SQL необходимо перечислить все неагрегированные столбцы из списка выбора в предложении GROUP BY. Использование MAX означает, что у вас есть агрегаты для x и y в первой половине UNION и для a, b и c во второй половине UNION.

2-ой вариант

INSERT INTO x(a, b, c)
    SELECT DISTINCT a, b, c
      FROM pqr
     WHERE p_a IS NULL;
INSERT INTO x(a, b, c, x, y)
    SELECT MAX(a) AS a, MAX(b) AS b, MAX(c) AS c, x, y
      FROM pqr
     WHERE p_a IS NOT NULL
     GROUP BY x, y;

Как обсуждалось ранее, вам нужны агрегаты по столбцам, которых нет в списке GROUP BY.

3-й вариант

Если вы имели в виду, что вы должны сгруппировать по x и y, а также a, b и c, то вторая половина UNION (или второй SELECT) упрощается до:

    SELECT a, b, c, x, y
      FROM pqr
     WHERE p_a IS NOT NULL
     GROUP BY a, b, c, x, y;

Или вы можете снова использовать DISTINCT:

    SELECT DISTINCT a, b, c, x, y
      FROM pqr
     WHERE p_a IS NOT NULL;
1 голос
/ 08 ноября 2011
declare @p_a datatype

select @p_a= P_a from prq

if(@p_a is null)

select a,b,c from prq group by a,b,c

else

select a,b,c from prq group by x,y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...