Как объединить несколько таблиц по диапазону дат в 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.

и мой запрос прямо сейчас-это одно соединение, как показано ниже (которое кажется, работает). Я пытаюсь добавить еще одно или несколько соединений, чтобы я мог вернуть еще несколько подсчетов в таблицу в результат одной строки. Мой текущий запрос:

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

могу ли я просто добавить больше соединений? (Я пробовал и споткнулся.) Или есть другой способ вернуть только количество (значения) в указанном диапазоне дат в каждом выбранном столбце.

любая помощь будет оценили.

1 ответов


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

Если вы хотите добавить больше eventtype, просто добавьте как ([1],[2],[3]..) внутри PIVOT() и в SELECT

добавить столько таблиц, сколько вы хотите.