Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.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 - Fatal编程技术网

Sql 按预定义日期范围分组

Sql 按预定义日期范围分组,sql,sql-server,group-by,Sql,Sql Server,Group By,在存储在其他表中的预定义时间段内,如何计算表中的发生次数 我有两张桌子: table1 +------------+---------+---------+ | Period | value 1 | value 2 | +------------+---------+---------+ | 2021-01-01 | 1234 | 45678 | | 2021-02-01 | 345 | 3456 | | 2021-03-01 | 34567 | 45678

在存储在其他表中的预定义时间段内,如何计算表中的发生次数

我有两张桌子:

table1
+------------+---------+---------+
| Period     | value 1 | value 2 |
+------------+---------+---------+
| 2021-01-01 | 1234    | 45678   |
| 2021-02-01 | 345     | 3456    |
| 2021-03-01 | 34567   | 45678   |
+------------+---------+---------+

table 2
+------------+---------+
| Date       | boolean |
+------------+---------+
| 2021-01-03 | 1       |
| 2021-01-06 | 0       |
| 2021-02-05 | 1       |
| 2021-02-13 | 1       |
| 2021-03-06 | 1       |
+------------+---------+
我想要下面的结果

+------------+---------+---------+-------|
| Period     | value 1 | value 2 | count |
+------------+---------+---------+-------+
| 2021-01-01 | 1234    | 45678   | 1     |
| 2021-02-01 | 345     | 3456    | 2     |
| 2021-03-01 | 34567   | 45678   | 1     |
+------------+---------+---------+-------+
我试过这样的方法

SELECT t1.*, SUM(t2.boolean) as count
FROM table1 t1
LEFT JOIN table2 t2
WHERE t2.Date BETWEEN t1.period AND DATEADD(month, 1, t1.period)

你很接近。要在
FROM
子句中定义表的关系,您不需要
WHERE
子句,您需要
ON
子句:

SELECT t1.*, SUM(t2.boolean) as count
FROM table1 t1
   LEFT JOIN table2 t2
       ON t2.Date BETWEEN t1.period AND DATEADD(month, 1, t1.period)
此外,由于您要在SELECT中使用
SUM()
进行聚合,因此您需要提供一个
groupby
来告诉数据库要对哪些列进行分组(每个未使用类似
SUM()
的函数进行聚合的列):


因为您需要第一个表中的所有列,所以我建议使用关联子查询:

SELECT t1.*,
       (SELECT SUM(t2.boolean) as count
        FROM table2 t2
        WHERE t2.Date BETWEEN t1.period AND DATEADD(month, 1, t1.period)
       ) as count
FROM table1 t1;
根据数据和索引的性质,这也可能更快——避免外部聚合通常是一种胜利

SELECT t1.*,
       (SELECT SUM(t2.boolean) as count
        FROM table2 t2
        WHERE t2.Date BETWEEN t1.period AND DATEADD(month, 1, t1.period)
       ) as count
FROM table1 t1;