Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何为每个组中的列选择非空值?_Sql_Group By - Fatal编程技术网

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