嗨我正在扩展一个查询,我有以下问题,我有一个表3用户,他们与其他表连接(加入),现在在这些表中,用户可以或不可以拥有数据,这取决于他们动作。
SELECT
COALESCE (credit.received, 0) AS CreditReceived,
COALESCE (purchase.used, 0) AS CreditUsed,
COALESCE (purchase.NumberOfPurchase, 0) AS NumberOfPurchase,
COALESCE (credit.received, 0) - COALESCE (purchase.used, 0) AS UserCredit,
dbo.[User].id_user,
dbo.[User].name,
dbo.[User].town,
dbo.[User].country
FROM (SELECT DISTINCT id_user
FROM dbo.UserCredit
UNION
SELECT DISTINCT id_user
FROM dbo.UserPurchase) AS users
INNER JOIN
dbo.[User] ON users.id_user = dbo.[User].id_user
LEFT OUTER JOIN
(SELECT
id_user,
SUM(creditRecieved) AS received
FROM
dbo.UserCredit AS UserCredit_1
GROUP BY id_user) AS credit
ON users.id_user = credit.id_user
LEFT OUTER JOIN
(SELECT
id_user,
SUM(creditUsed) AS used,
COUNT(creditUsed) AS NumberOfPurchase
FROM
dbo.UserPurchase AS UserPurchase_1
GROUP BY id_user) AS purchase
ON users.id_user = purchase.id_user
信息来自这些表格;
表dbo.user
id_user name town country
----------- ----------- -------------- -------------
1 George New York USA
2 Lucas San Diego GB
3 Steven San Fran Germany
表dbo.UserCredit
id id_user creditRecieved PurchasePrice
----------- ----------- -------------- -------------
1 1 150 750
2 1 25 100
3 2 65 15
表dbo.UserPurchase
id id_user creditUsed date
----------- ----------- ----------- -----------
1 1 175 NULL
2 2 3 NULL
3 2 2 NULL
我得到的只是两个第一个user_id的结果,而第三个(史蒂文)没有显示在结果中,我想这是因为id不存在于另外两个表格,但我希望能用COALESCE修正,其中四个将设为0.我做错了什么?
答案 0 :(得分:0)
您不需要派生表"用户。"它不包含所有用户ID,并且是不必要的。删除它并将连接保留在用户表中,它应该可以正常工作。
答案 1 :(得分:0)
将第一个DISTINCT替换为dbo。[User]而不是dbo.UserCredit,它给了我正确的结果;由于COALESCE,概述中的所有用户都有信用或没有信用:)
SELECT
COALESCE (credit.received, 0) AS CreditReceived,
COALESCE (purchase.used, 0) AS CreditUsed,
COALESCE (purchase.NumberOfPurchase, 0) AS NumberOfPurchase,
COALESCE (credit.received, 0) - COALESCE (purchase.used, 0) AS UserCredit,
dbo.[User].id_user,
dbo.[User].name,
dbo.[User].town,
dbo.[User].country
FROM (SELECT DISTINCT id_user
FROM dbo.[User]
UNION
SELECT DISTINCT id_user
FROM dbo.UserPurchase) AS users
INNER JOIN
dbo.[User] ON users.id_user = dbo.[User].id_user
LEFT OUTER JOIN
(SELECT
id_user,
SUM(creditRecieved) AS received
FROM
dbo.UserCredit AS UserCredit_1
GROUP BY id_user) AS credit
ON users.id_user = credit.id_user
LEFT OUTER JOIN
(SELECT
id_user,
SUM(creditUsed) AS used,
COUNT(creditUsed) AS NumberOfPurchase
FROM
dbo.UserPurchase AS UserPurchase_1
GROUP BY id_user) AS purchase
ON users.id_user = purchase.id_user