【发布时间】:2014-03-30 08:58:23
【问题描述】:
我的MasterSales 表是这样的
SalesDate | Category | Total
-----------------------------
1/1/2000 01 100
1/1/2000 02 110
1/2/2000 01 80
1/2/2000 03 20
我的Category 表看起来像这样
ID | Name ---------- 01 | A 02 | B 03 | C 04 | D
我的查询如下所示:
SELECT m.SalesDate, c.Name, SUM(ISNULL(m.Total,0)) AS TotalSales
FROM MasterSales m
LEFT JOIN Category c ON c.ID = m.Category
WHERE m.SalesDate BETWEEN '1/1/2000' AND '1/2/2000'
我想要的结果是这样的:
SalesDate | Name | TotalSales
------------------------------
1/1/2000 A 100
1/1/2000 B 110
1/1/2000 C 0
1/1/2000 D 0
1/2/2000 A 80
1/2/2000 B 0
1/2/2000 C 20
1/2/2000 D 0
但我得到的结果是这样的:
SalesDate | Name | TotalSales
------------------------------
1/1/2000 A 100
1/1/2000 B 110
1/2/2000 A 80
1/2/2000 C 20
我已经尝试使用RIGHT JOIN 而不是LEFT JOIN 并在FROM 子句上切换表,但结果仍然相同。谁能帮我解释一下为什么它不能正常工作?
附: : 我使用的是 SQL Server 2005(如果重要的话)
【问题讨论】:
-
在查询末尾添加
GROUP BY m.SalesDate, c.Name -
这里的逻辑是什么? 01012000 和 01022000 类 D 的销售日期如何获得?
-
您加入条件
c.ID = m.Category,所以很明显Name=D不会被选中,因为id=4在其他表中不可用 -
@TinTran:我也试过了,但结果是一样的。@SatheeshVariath Variath:我在查询中使用
Between@Gone:我想通过使用left join Category所有数据即使另一个表中没有匹配项,来自Category也会出现?顺便说一句,如何在评论中添加断线? -
非常感谢所有试图提供帮助的人。我选择了 Darka 的答案,因为它是在 management studio 上尝试的最简单的答案,而且效果很好(不是其他人都错了,我只是没有全部尝试):D
标签: sql sql-server left-join right-join