2016-08-04 51 views
0

我有我的数据库3个表: -SQL服务器的多个JOIN:避免重复值

客户:

CId | CName | CLocation | CJoinDate 

付款方式:

TxnId | TxStatus | TxComment | TxAmount | CId | TxDate 

约会:

AppId | AppCode | CId | ADate | AComment 

当我做了两个表格的左连接那么计算结果就会正确。但是当我尝试与3个表连接时,计算结果是错误的。

的如: -

如果我尝试此查询然后计算总金额是正确的:

SELECT c.CName, sum(p.TxAmount) 
FROM Customer c LEFT JOIN Payment p ON c.CId = p.CId 
WHERE p.TxStatus = 1 
GROUP BY c.CName; 

在上面的查询中,我只是将两个表,给了我正确的结果。

现在,当我想在一张表中显示所有的记录,所以我不得不加入3个表格。 下面是我试一下查询:

SELECT c.CName as Name, sum(p.TxAmount) as Payment, count(distinct a.ADate) as Total_Visit 
FROM Customer c LEFT JOIN Payment p ON c.CId = p.CId LEFT JOIN Appointment a ON c.CId = a.CId 
WHERE p.TxStatus = 1 
GROUP BY c.CName; 

上面的查询给了我错了付款金额为每一个客户。导致错误结果的原因是与每个客户的付款表相比,约会表具有更多的行。因此,要显示所有的约会条目,付款金额会得到重复计算错误。

如何解决上述情况与上述查询。

韩国社交协会

编辑:其实那里有2-3多个表,我有一个GROUP BY每月子句一起加入类同委任表格。

编辑1:修复它由多个CTE。感谢您宝贵的指点,这确实有帮助。

回答

0

尝试使用子查询:

SELECT 
c.CName as Name 
, sum(p.TxAmount) as Payment 
, Total_Visit = (SELECT count(distinct a.ADate) FROM Appointment a ON c.CId = a.CId) 
FROM Customer c 
LEFT JOIN Payment p ON c.CId = p.CId 
WHERE p.TxStatus = 1 
GROUP BY c.CName; 
+0

其实我有多个表加入。上述查询只是一个大问题的小问题。所以我想知道如果我们能够用JOIN来解决问题,我们可以做些什么。 – Villie

+0

好的,你也可以为其他表使用子查询。考虑使用子查询和Pawel的CTE变体编写查询。那么使用执行计划成本最低的那个? –

+0

我们是否可以使用带有GROUP BY子句的CTE或子查询,因为我已经显示给定年份的每个月的总数。 – Villie

1

使用一个简单的CTE表达式,如果你确信你的总和由第一查询

WITH cte AS 
(
SELECT c.CName, c.CID, sum(p.TxAmount) AS sumAmount 
FROM Customer c LEFT JOIN Payment p ON c.CId = p.CId 
WHERE p.TxStatus = 1 
GROUP BY c.CName, c.CID 
) 
SELECT cte.CName, cte.sumAmount, count(distinct a.ADate) as Total_Visit 
FROM cte LEFT JOIN Appointment a ON c.CId = a.CId 
GROUP BY c.CName, cte.sumAmount 
0

您可以为每个识别符计算total_visit正确计算然后加入子查询

SELECT 
    c.CName as Name 
, sum(p.TxAmount) as Payment 
, Total_Visit 
FROM Customer c 
LEFT JOIN Payment p ON c.CId = p.CId 
LEFT JOIN (SELECT a.CId, count(distinct a.ADate) Total_visit FROM Appointment a group by a.CId) as a on c.CId = a.CId 
WHERE p.TxStatus = 1 
GROUP BY c.CName;