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中的这些x,y列是NULLABLE。
答案 0 :(得分:2)
表X必须至少包含五个列,我们可以认为这些列的名称为a
,b
,c
,x
,y
。< / p>
如果您正在执行单个INSERT,则需要插入所有五列。如果您正在执行多个INSERT操作,则可以插入3列然后插入5列(反之亦然)。您可能必须使用第一个备选项的select-list中的NULL值进行操作。我假设列x
和y
是明确的INTEGER - 选择合适的类型。
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;
您可以在UNION第一部分的选择列表中使用GROUP BY a, b, c
前面的DISTINCT替换a
子句。在大多数SQL DBMS中,必须列出GROUP BY子句中select-list中的所有非聚合列。使用MAX意味着您在UNION的前半部分有x
和y
以及下半年有a
,b
和c
的聚合UNION。
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列表中的列上进行聚合。
如果您的意思是必须按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 :(得分:1)
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