填写剩余的SQL类别

填写剩余的SQL类别,sql,sql-server,Sql,Sql Server,我有一位客人: UserId Name Amount 1 AA 1 1 BB 1 1 CC 1 1 DD 1 2 AA 1 2 BB 1 2 CC 1 3 AA 1 3 CC 1 我需要选择我将看到的每个用户ID的每个名称(AA、BB、CC、DD)-如果他

我有一位客人:

UserId  Name    Amount
1       AA        1
1       BB        1
1       CC        1
1       DD        1
2       AA        1
2       BB        1
2       CC        1
3       AA        1
3       CC        1
我需要选择我将看到的每个用户ID的每个名称(AA、BB、CC、DD)-如果他在上一个表中没有该名称的记录,我也要用0填充金额。因此,对于给定的示例,结果应为:

UserId  Name    Amount
1        AA       1
1        BB       1
1        CC       1
1        DD       1
2        AA       1
2        BB       1
2        CC       1
2        DD       0
3        AA       1
3        BB       0
3        CC       1
3        DD       0

我认为我不能用
“case when…”
来实现这一点,所以也许可以在表上使用一些只包含所有名称的连接。。?感谢您的帮助

请分两步思考。首先获取所有行,然后填充值。第一部分使用
交叉联接
。第二个操作可以通过
左连接
(或相关子查询)完成:


分两步考虑这个问题。首先获取所有行,然后填充值。第一部分使用
交叉联接
。第二个操作可以通过
左连接
(或相关子查询)完成:

你能试试这个吗

SELECT B.UserId, A.Name, ISNULL(C.Amount,0) Amount
FROM 
(SELECT DISTINCT Name FROM TEMP) A
CROSS JOIN 
(SELECT DISTINCT USERID FROM TEMP) B 
LEFT JOIN TEMP C ON B.USERID = C.USERID AND A.NAME = C.NAME
ORDER BY B.USERID, A.NAME
你能试试这个吗

SELECT B.UserId, A.Name, ISNULL(C.Amount,0) Amount
FROM 
(SELECT DISTINCT Name FROM TEMP) A
CROSS JOIN 
(SELECT DISTINCT USERID FROM TEMP) B 
LEFT JOIN TEMP C ON B.USERID = C.USERID AND A.NAME = C.NAME
ORDER BY B.USERID, A.NAME

“在只有所有名称的表上加入”,是的!“在只有所有名称的表上加入”,是的!