【发布时间】:2015-03-11 15:15:31
【问题描述】:
我正在尝试按分支、按周提取一些带有事务计数的数据,这些数据稍后将用于提供一些动态 .Net 图表。
我有一个日历表、一个分支表和一个事务表。
这是我的数据库信息(仅包括相关列):
分支表:
ID (int), Branch (varchar)
日历表:
Date (datetime), WeekOfYear(int)
交易表:
Date (datetime), Branch (int), TransactionCount(int)
所以,我想做如下的事情:
Select b.Branch, c.WeekOfYear, sum(TransactionCount)
FROM BranchTable b
LEFT OUTER JOIN TransactionTable t
on t.Branch = b.ID
JOIN Calendar c
on t.Date = c.Date
WHERE YEAR(c.Date) = @Year // (SP accepts this parameter)
GROUP BY b.Branch, c.WeekOfYear
现在,EXCEPT 可以在分支一周内没有任何交易时起作用,在这种情况下,该分支在该周返回 NO RECORD。我想要是获得那个分支,那周和总和为“0”。我试过 isnull(sum(TransactionCount), 0) - 但这也没有用。所以我会得到以下信息(为了说明目的,总结一下):
+--------+------------+-----+
| Branch | WeekOfYear | Sum |
+--------+------------+-----+
| 1 | 1 | 25 |
| 2 | 1 | 37 |
| 3 | 1 | 19 |
| 4 | 1 | 0 | //THIS RECORD DOES NOT GET RETURNED, BUT I NEED IT!
| 1 | 2 | 64 |
| 2 | 2 | 34 |
| 3 | 2 | 53 |
| 4 | 2 | 11 |
+--------+------------+-----+
那么,为什么左外连接不起作用?不应该这样吗
任何帮助将不胜感激。谢谢!
编辑:样本表数据:
Branch表:
+----+---------------+
| ID | Branch |
+----+---------------+
| 1 | First Branch |
| 2 | Second Branch |
| 3 | Third Branch |
| 4 | Fourth Branch |
+----+---------------+
Calendar表:
+------------+------------+
| Date | WeekOfYear |
+------------+------------+
| 01/01/2015 | 1 |
| 01/02/2015 | 1 |
+------------+------------+
Transaction表
+------------+--------+--------------+
| Date | Branch | Transactions |
+------------+--------+--------------+
| 01/01/2015 | 1 | 12 |
| 01/01/2015 | 1 | 9 |
| 01/01/2015 | 2 | 4 |
| 01/01/2015 | 2 | 2 |
| 01/01/2015 | 2 | 23 |
| 01/01/2015 | 3 | 42 |
| 01/01/2015 | 3 | 19 |
| 01/01/2015 | 3 | 7 |
+------------+--------+--------------+
【问题讨论】:
-
把
JOIN Calendar c也改成LEFT JOIN Calendar c。 -
您需要创建每个分支和周的完整列表,然后将其加入事务。
-
我不知道该怎么做 - 分支表和日历表没有任何要加入的列
-
@Darka - 我试过了,但得到了相同的结果。
-
您可以使用每个表格中的一些示例数据来编辑您的帖子吗?
标签: sql sql-server group-by outer-join