繁体   English   中英

如何在SQL中按日期范围连接多个表?

[英]How to join multiple tables by date range in SQL?

我对SQL比较陌生。 我一直在努力构建一个返回单行的非常简单的查询。

我正在尝试从几个不同的表中选择多个列值计数,每个计数在相同的日期范围内被拉出。

我的数据库中的表类似于:

|   CreationDate      | LastName    | EventType    |
|:--------------------|------------:|:------------:| ...
| 2013-01-02 18:00:21 | Doe         |     2        |  
| 2013-01-07 18:00:24 | Blanks      |     2        | ...
| 2013-01-09 17:00:21 | Puccini     |     1        |

所有表都有类似的CreationDate列。

现在我的查询是一个单一的JOIN,如下所示(这似乎有效)。 我正在尝试添加一个或多个JOIN,以便我可以将每个表的多个计数返回到单行结果。 我目前的查询:

DECLARE @startdate DATETIME = '##startdate##';
DECLARE @enddate DATETIME = '##enddate##';

SELECT  ISNULL(t2.Year, t1.Year) ,
        ISNULL(t2.Month, t1.Month) ,
        t1.LastName1 ,
        t2.LastName2
FROM    ( SELECT    DATEPART(year, table1.CreationDate) Year ,
                    DATEPART(month, table1.CreationDate) Month ,
                    COUNT(table1.column2) LastName1
          FROM      table1
          WHERE     EventType = 2
                    AND CreationDate BETWEEN @startdate AND @enddate
          GROUP BY  DATEPART(year, table1.CreationDate) ,
                    DATEPART(month, table1.CreationDate)
        ) AS t1

        JOIN 

             ( SELECT   DATEPART(year, table2.CreationDate) Year ,
                        DATEPART(month, table2.CreationDate) Month ,
                        COUNT(table2.column2) LastName2
               FROM     table2
               WHERE    EventType = 1
                        AND CreationDate BETWEEN @startdate AND @enddate
               GROUP BY DATEPART(year, table2.CreationDate) ,
                        DATEPART(month, table2.CreationDate)
             ) AS t2 ON t1.Year = t2.Year
                        AND t1.Month = t2.Month
ORDER BY t1.Year ,
        t1.Month

我可以添加更多JOIN吗? (我已经尝试了这个并且发现了。)或者是否有另一种方法可以在每个选定列中的指定日期范围内返回COUNT(值)。

任何帮助,将不胜感激。

DECLARE @startdate DATETIME 
set @startdate= '2013-01-02 18:00:21.000';
DECLARE @enddate DATETIME 
set @enddate= '2013-01-09 17:00:21.000';


SELECT  YEAR ,
        MONTH ,
        [1] ,
        [2]
FROM    ( (SELECT    DATEPART(year, CreationDate) Year ,
                    DATEPART(month, CreationDate) Month ,
                    eventType ,
                    COUNT(LastName) namecount
          FROM      table1
          WHERE     CreationDate BETWEEN @startdate AND @enddate
          GROUP BY  DATEPART(year, CreationDate) ,
                    DATEPART(month, CreationDate) ,
                    EventType)
                    union all
          (SELECT    DATEPART(year, CreationDate) Year ,
                    DATEPART(month, CreationDate) Month ,
                    eventType ,
                    COUNT(LastName) namecount
          FROM      table2
          WHERE     CreationDate BETWEEN @startdate AND @enddate
          GROUP BY  DATEPART(year, CreationDate) ,
                    DATEPART(month, CreationDate) ,
                    EventType )         
        ) u PIVOT( SUM(namecount) FOR eventtype IN ( [1], [2] ) ) as pvt
ORDER BY Year ,
        Month

如果你想添加更多的事件类型,只需添加如([1],[2],[3] ..)内PIVOT()也是在SELECT

根据需要添加任意数量的表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM