SQL QUERY使用LEFT JOIN和CASE语句

Sta*_*ser 7 sql sql-server select

这是我的两张桌子的一个例子.

在此输入图像描述

问题: 如何使用左连接创建SQL查询?

这里是情景

正如我之前所说,我有两个表(TABLE1和TABLE2),我尝试使用左连接,以便我可以在一个表中组合两个UserID

所以这是代码

select * from table1 a left join table2 on a.userid = b.userid
Run Code Online (Sandbox Code Playgroud)

所以现在合并了两个表.

我需要做的是:
如果状态全部完成那么'完成'
然后如果状态包含完整和不完整然后'不完整'
其他'没有状态'

它应该是这样的.

在此输入图像描述

注意:
由于UserID = 1(table1)包含完整和不完整状态(table2),
因此它显示'incomplete'(新列),

因为UserID = 4(table1)包含所有完整状态(表2),
然后显示'completed'(new柱)

-----------------------------------

如果我将状态更改为INTEGER,该怎么办?

在此输入图像描述

同样的程序.谢谢

Joh*_*Woo 9

SELECT  a.*, 
        CASE WHEN b.totalCount = 1 AND b.totalINC = 0 THEN 'Complete'
             WHEN totalCount IS NULL THEN ''
             ELSE 'Incomplete'
        END STatus
FROM    table1 a
        LEFT JOIN
        (
            SELECT  UserID, 
                    COUNT(DISTINCT STATUS) totalCount,
                    SUM(CASE WHEN status = 'Incomplete' THEN 1 ELSE 0 END) totalINC
            FROM table2
            GROUP BY UserID
        ) b ON a.UserID = b.UserID
Run Code Online (Sandbox Code Playgroud)

更新1

你唯一要改变的是 CASE

SELECT  a.*, 
        CASE WHEN b.totalCount = 1 AND b.totalINC = 0 THEN 'Complete'
             WHEN totalCount IS NULL THEN ''
             ELSE 'Incomplete'
        END STatus
FROM    table1 a
        LEFT JOIN
        (
            SELECT  UserID, 
                    COUNT(DISTINCT STATUS) totalCount,
                    SUM(CASE WHEN status <> 100 THEN 1 ELSE 0 END) totalINC
            FROM table2
            GROUP BY UserID
        ) b ON a.UserID = b.UserID;
Run Code Online (Sandbox Code Playgroud)


Rap*_*aus 5

简单但棘手的解决方案:

由于 INCOMPLETE(对于数据库)大于 COMPLETE,因此您可以简单地执行以下操作

SELECT a.UserID, 
  LOWER(COALESCE(MAX(b.status) , 'NO STATUS'))
  FROM table1 a 
 LEFT JOIN table2 b on a.userid = b.userid
 GROUP BY a.UserID
Run Code Online (Sandbox Code Playgroud)

SqlFiddle(还有Andomar更好的解决方案)

  • 为欺骗行为+1,但如果状态被翻译,会导致一个非常严重的错误 (2认同)