Sql 如何为每个组中的列选择非空值?
我有下表Sql 如何为每个组中的列选择非空值?,sql,group-by,Sql,Group By,我有下表 | col1 | col2 | col3 | col4 | | ---- | ---- | ---- | ---- | | 123 | 345 | LA | 001 | | 123 | 345 | AB | | | 123 | 345 | LA | | | 123 | 345 | | | | abc | cde | LA | | | abc | cde | | | | abc
| col1 | col2 | col3 | col4 |
| ---- | ---- | ---- | ---- |
| 123 | 345 | LA | 001 |
| 123 | 345 | AB | |
| 123 | 345 | LA | |
| 123 | 345 | | |
| abc | cde | LA | |
| abc | cde | | |
| abc | cde | AB | |
| abc | cde | LA | |
| ooo | zzz | LA | |
| ooo | zzz | LA | 001 |
| ooo | zzz | LA | |
| ooo | zzz | LA | 001 |
| 12 | 35 | LA | |
| 12 | 35 | LA | |
| 12 | 35 | LA | |
| 12 | 35 | LA | |
我想为每组col1和col2选择,如果组中存在col3,则col3必须为AB,否则为空,如果存在非空值,则col4应为非空,否则应为空。每组的col4将具有唯一的非空白值或空白值
期望输出:
| col1 | col2 | col3 | col4 |
|------|------|------|------|
| 123 | 345 | AB | 001 |
| abc | cde | AB | |
| ooo | zzz | | 001 |
| 12 | 35 | | |
所需代码:
select col1, col2,
(AB if AB present else blank) as col3,
(non-blank value if non-blank is present else blank) as col4
from test
group by col1, col2;
到目前为止,我所尝试的:
select col1, col2,
max(col4) as col4
from test
group by col1, col2;
我不知道如何为col3做这件事
SQL Fiddle:
注:
我需要一个与供应商无关的解决方案。我认为特定于RDBMS的解决方案可能在我使用的平台上工作,但我必须测试这个答案/解决方案,然后再与您联系
我不是从源代码进行查询,而是从网格进行查询,因此我没有在后端使用RDBMS
这是一个优先级查询。行号通常用于:
select col1, col2, (case when col3 = 'AB' then col3 end) as col3,
col4
from (select t.*,
row_number() over (partition by col1, col2
order by (case when col3 = 'AB' then 1 else 2 end),
(case when col4 <> '' then 1 else 2 end)
) as seqnum
from t
) t
where seqnum = 1;
对于col3列,您需要一个CASE语句,对于col4列,只需要MAX或MIN:
看。
结果:
检查这个-
SELECT B.col1,B.col2,B.N_Col3,MAX(B.col4)
FROM
(
SELECT your_table.*,A.col3 N_Col3
FROM your_table
LEFT JOIN
(
SELECT * FROM your_table
WHERE col3 = 'AB'
)A
ON A.col1 = CTE.col1 AND A.col2 = CTE.col2
)B
GROUP BY B.col1,B.col2,B.N_Col3
ORDER BY 3 DESC
你的回答在123345案件中失败了。你能看看这个吗?col4应该是001,但是非常感谢。这个解决方案有效。我对col3部分的情况感到困惑。当group by期望在select语句中聚合时,您能解释一下这是如何工作的吗?我认为SUM在这种情况下更具可读性,因为它类似于EXISTIONS。@scientific_explorer聚合部分:sumcase当col3='AB'那么1 else 0 end存在时,group by语句需要它。然后,您可以任意转换此结果。@求和后,得出的值或多或少成为该记录的文字“常量”。。。不确定我是否使用了正确的术语,例如如何在GROUP BY查询(如选择“1”作为编号)中始终允许使用文字常量。。。在这里我正确地使用了这个术语。。。这就是为什么你可以在网上办案Sum@RaymondNijland我说得再好不过了。
| col1 | col2 | col3 | col4 |
| ---- | ---- | ---- | ---- |
| 12 | 35 | | |
| 123 | 345 | AB | 001 |
| abc | cde | AB | |
| ooo | zzz | | 001 |
SELECT B.col1,B.col2,B.N_Col3,MAX(B.col4)
FROM
(
SELECT your_table.*,A.col3 N_Col3
FROM your_table
LEFT JOIN
(
SELECT * FROM your_table
WHERE col3 = 'AB'
)A
ON A.col1 = CTE.col1 AND A.col2 = CTE.col2
)B
GROUP BY B.col1,B.col2,B.N_Col3
ORDER BY 3 DESC
select col1, col2, max(col3) col3, max(col4) col4
from
(
select col1, col2, case when col3 = 'AB' THEN 'AB' ELSE ' ' END col3, max(COL4) col4
from @table
group by col1, col2, case when col3 = 'AB' THEN 'AB' ELSE ' ' END
) A
group by col1, col2