Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 具有左外部联接的数据聚合_Sql_Sql Server_Group By_Outer Join - Fatal编程技术网

Sql 具有左外部联接的数据聚合

Sql 具有左外部联接的数据聚合,sql,sql-server,group-by,outer-join,Sql,Sql Server,Group By,Outer Join,我试图按分支、按周提取一些带有事务计数的数据,这些数据稍后将用于提供一些动态的.Net图表 我有一个日历表,一个分支表和一个事务表 以下是我的数据库信息,仅包含相关列: 分支表: ID (int), Branch (varchar) 日历表: Date (datetime), WeekOfYear(int) 交易表: Date (datetime), Branch (int), TransactionCount(int) 因此,我想做如下工作: Select b.Branch, c.Wee

我试图按分支、按周提取一些带有事务计数的数据,这些数据稍后将用于提供一些动态的.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
现在,除了一个分支在一周内没有任何事务外,这是有效的,在这种情况下,该分支在该周没有返回任何记录。我想得到的是那一周的那一个分支和0的总和。我尝试了isnullsumTransactionCount,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 |
+--------+------------+-----+
那么,为什么左边的外部连接不起作用呢?这不是应该的吗

任何帮助都将不胜感激。谢谢大家!

编辑:示例表数据:

分支表:

ID (int), Branch (varchar)
日历表:

Date (datetime), WeekOfYear(int)
事务表


如果要返回包含每个分支和每周的查询,则需要首先创建该分支和每周的完整列表,然后使用事务的左联接来获取计数。代码类似于:

select bc.Branch, 
   bc.WeekOfYear, 
   TotalTransaction = coalesce(sum(t.TransactionCount), 0)
from
(
  select b.id, b.branch, c.WeekOfYear, c.date
  from branch b
  cross join Calendar c
  -- if you want to limit the number of rows returned use a WHERE to limit the weeks
  -- so far in the year or using the date column
  WHERE c.date <= getdate()
   and YEAR(c.Date) = @Year // (SP accepts this parameter)
) bc
left join TransactionTable t
  on t.Date = bc.Date
  and bc.id = t.branch
GROUP BY bc.Branch, bc.WeekOfYear

此代码将在子查询中创建每个分支以及每个日期的完整列表。一旦你有了这个列表,你就可以加入到交易中来获得你的交易总数,并且你可以根据你的需要返回每个日期

在引入交易之前引入日历:

SELECT b.Branch, c.WeekOfYear, sum(TransactionCount)
FROM BranchTable b 
INNER JOIN CalendarTable c ON YEAR(c.Date) = @Year
LEFT JOIN TransactionTable t ON t.Branch = b.ID AND t.Date = c.Date
GROUP BY b.Branch, c.WeekOfYear
ORDER BY c.WeekOfYear, b.Branch

将JOIN Calendar c也更改为LEFT JOIN Calendar c。您需要创建每个分支和周的完整列表,然后将其保留到事务中。我不确定如何执行此操作-分支表和日历表没有任何列可供选择join@Darka-我试过了,但是得到了同样的结果。你能用每个表中的一些样本数据编辑你的帖子吗?我一开始也在考虑交叉连接,但他确实想限制他看到的日历记录,因此使用WHERE子句作为连接条件的内部连接似乎更合适。起初我认为这看起来很接近,但是当我需要12个4个分支时,这个查询返回265条记录,到目前为止的3周2015@Stan您可以通过在子查询中使用where子句来限制日历日期的数量-如果您只需要一年中的前几周,则在c.date列中包含where weekofyear<4或将其与getdate进行比较进行筛选-请参阅此演示-@JoelCoehoorn内部联接正在执行与交叉联接相同的功能因为您没有将分支表加入特定列上的日历表-请参阅此演示-他们需要使用其他筛选器(如“我的编辑”)来限制今年迄今为止的行数或筛选特定周数。伙计们,请查看Joel的答案。这正是我需要的。谢谢你的帮助!我将对此进行测试。我要到下周才能回来工作,但我一定会重新浏览这个页面并接受你的答案,如果这行得通的话。这行得通!我必须做的唯一更改是isnullsumTransactionCount,0此查询中存在语法错误。它将在ORDER BY上抛出一个错误。如何工作您不能在ORDER BY中使用B.id。它将抛出B.id在顺序中无效。。。顺便说一句,不是我的DVDepends在你的数据库引擎上。Sql Server非常乐意在ORDER BY子句中使用表别名。
SELECT b.Branch, c.WeekOfYear, sum(TransactionCount)
FROM BranchTable b 
INNER JOIN CalendarTable c ON YEAR(c.Date) = @Year
LEFT JOIN TransactionTable t ON t.Branch = b.ID AND t.Date = c.Date
GROUP BY b.Branch, c.WeekOfYear
ORDER BY c.WeekOfYear, b.Branch