SQL - 按ID分组求两列之和

3

我希望将“Immo”和“Conso”两列相加,按“ID”分组,以创建一个新变量“Mixte”。我的新变量“Mixte”如下:

  • 如果一个ID在“Immo”中至少有1个,并且在“Conso”中也至少有1个,则“Mixte”为是,否则为否。

例如:

Ident   | Immo  | Conso | Mixte
---------------------------------
1       | 0     | 1     | yes
1       | 1     | 0     | yes
2       | 1     | 0     | no
3       | 0     | 1     | no
3       | 0     | 1     | no
3       | 0     | 1     | no
4       | 0     | 1     | yes
4       | 0     | 1     | yes
4       | 1     | 0     | yes

谢谢你的帮助。如果我表达不清楚,请随时问我问题。

你的结果必须显示所有记录,还是仅显示每个Ident的一行即可(结果中不显示Immo和Conso,仅显示Ident和Mixte)? - Thorsten Kettner
4个回答

4

使用相关子查询:

select t1.Ident, t1.Immo, t1.Conso,
       case when (select max(Immo) + max(Conso) from tablename t2
                  where t2.Ident = t1.Ident) = 2 then 'yes'
            else 'no'
       end as Mixte
from tablename t1

Ident 是 ANSI SQL 中的保留字,因此您可能需要用"Ident"进行限定。


它在SAS中能用吗?当我执行我的proc sql时,它会给我一个错误...这个案例内容看起来对于SAS不太好。 - MVachelard

1

这可能不是最顺畅的方式,但我会这样做:

    WITH X AS 
    (
    SELECT T.Ident, MAX(T.Immo) Immo, MAX(T.Conso) Conso FROM Table AS T
    GROUP BY T.Ident
    )

    SELECT X.*
    ,CASE WHEN X.Immo > 0 AND X.Conso > 0 THEN 'YES'
    ELSE 'NO' 
    END Mixte
    FROM X

这看起来完全错误。首先,cte只给你一个记录,有两列,都等于1。而且在你的cte中没有Ident列。所以你不能从cte中读取并按Ident分组。而仅仅显示一个简单的yes和no列表的结果肯定也不是想要的。 - Thorsten Kettner
你对第二部分是正确的,但我不能同意第一部分。如果参数的值至少为1,则CTE应该给出两列,两列的值都至少为1。 - EpicKris
我指的是包含immo=1和conso=1记录的样本,因此查询结果将为(1,1)。现在您已更改了查询并进行了修复。查询看起来比必要的要复杂一些,但可以正常工作——只要OP对每个Ident仅有一个结果行满意即可。(我的关于此的问题尚未得到OP的回答)。 - Thorsten Kettner
哦,对了。我的结果与 OP 的示例相当不同。他需要决定自己可以接受什么。是的,我知道我的答案并不像应该那样简单,但是嘿...我也在这里学习 :) 感谢您的建议。 - EpicKris

1
select ident,result=(case when sum(Immo)>0 and sum(Conso)>0 then 'yes' 
               else 'no' end)
from tabname (NOLOCK)
group by id

0
在SQL Server中,你可以尝试使用窗口函数,类似于:
select Ident, Immo, Conso, 
       case when rn1 > 0 and rn2 > 0 then 'Yes' else 'No' end as Mixte
from (
    select
           max(Immo) over (partition by Ident) rn1,
           max(Conso) over (partition by Ident) rn2,
           *
    from table_name
)x

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接