T-SQL(Azure)仅显示2个结果而不是3个结果

时间:2017-10-05 15:45:32

标签: sql sql-server azure

嗨我正在扩展一个查询,我有以下问题,我有一个表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.我做错了什么?

2 个答案:

答案 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