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