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,该怎么办?

同样的程序.谢谢
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)
简单但棘手的解决方案:
由于 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更好的解决方案)
| 归档时间: |
|
| 查看次数: |
52753 次 |
| 最近记录: |