Может кто-нибудь сказать мне, почему я не могу присоединить эти таблицы?Первая таблица представляет собой динамическую таблицу Calendar
, содержащую только дату, а вторая таблица представляет собой таблицу данных с датой / временем, именем поведения (String), Account # (int).Мне нужно присоединиться к этим таблицам, чтобы все даты появлялись, даже если в тот день не было поведения для этой учетной записи.
В настоящее время я получаю данные, которые выглядят так:
ACCT# Date Behavior 1 Behavior 2
-------------------------------------------------
123456 2/3/2018 1 3
123456 2/5/2018 1 2
123456 2/10/2018 1 0
123456 2/11/2018 1 0
Я хочу / нужно, чтобы это было:
ACCT# Date Behavior 1 Behavior 2
----------------------------------------------------
123456 2/1/2018 0 0
123456 2/2/2018 0 0
123456 2/3/2018 1 3
123456 2/4/2018 0 3
123456 2/5/2018 1 0
123456 2/6/2018 0 0
123456 2/7/2018 0 0
123456 2/8/2018 0 0
123456 2/9/2018 0 1
123456 2/10/2018 1 0
123456 2/11/2018 1 0
Это запрос, который яЯ использую
DECLARE @Start DATE, @End DATE, @Account# INT, @behavior varchar(50)
SET @Start = '2/1/2019';
SET @End = '3/20/2019';
SET @FSH = '123456';
SET @Behavior = 'Attack';
;WITH MonthDates AS
(
SELECT
DATEADD(DAY, n1.number * 10 + n0.number, @Start) AS date
FROM
(SELECT 1 AS number UNION
SELECT 2 UNION
SELECT 3 UNION
SELECT 4 UNION
SELECT 5 UNION
SELECT 6 UNION
SELECT 7 UNION
SELECT 8 UNION
SELECT 9 UNION
SELECT 0) AS n0
CROSS JOIN
(SELECT 1 AS number UNION
SELECT 2 UNION
SELECT 3 UNION
SELECT 4 UNION
SELECT 5 UNION
SELECT 6 UNION
SELECT 7 UNION
SELECT 8 UNION
SELECT 9 UNION
SELECT 0) AS n1
WHERE
DATEADD(DAY, n1.number * 10 + n0.number, @Start) BETWEEN @Start AND @End
)
SELECT
md.date,
ACCT#,
COUNT(CASE Behavior WHEN 'Behavior1' THEN 1 ELSE NULL END) AS Behavior1Alias,
COUNT(CASE Behavior WHEN 'Behavior1' THEN 1 ELSE NULL END) AS Behavior2Alias
FROM
vw_MaladaptiveDailySummary as vwMals
FULL JOIN
MonthDates AS md ON FORMAT(md.Date,'yyyy-MM-dd') = FORMAT(vwMals.Date,'yyyy-MM-dd')
WHERE
vwMals.Date >= @start AND vwMals.date <= @end
AND Account# = @FSH
GROUP BY
md.date
ORDER BY
md.Date
Я обновил свой запрос следующим образом:
declare @Start date, @End date, @FSH int, @behavior varchar(max)
Set @Start='2/1/2018';
Set @End ='12/20/2019';
Set @FSH ='123456';
set @Behavior = 'Attack';
SELECT
MonthDates.Date
,count(case Behavior when 'Behavior1' then 1 else NULL end) as BehaviorsAlias1
,count(case Behavior when 'Behavior2' then 1 else null end) as BehaviorAlias2
FROM
(
SELECT
Date = DateAdd( Day, n1.number * 10 + n0.number, @Start )
FROM
(SELECT 1 AS number UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) as n0
CROSS JOIN
(SELECT 1 AS number UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) as n1
WHERE DateAdd( Day, n1.number * 10 + n0.number,@Start ) BETWEEN @Start AND @End
) AS MonthDates
LEFT JOIN vw_MaladaptiveDailySummary
ON vw_MaladaptiveDailySummary.DATE = MonthDates.Date
GROUP BY
MonthDates.Date
ORDER BY
MonthDates.Date
Это производит половину того, что я хочу;другая половина должна быть в состоянии фильтровать ACCT # / и / или Поведение.Результаты, которые я получаю сейчас, представляют собой сумму всех ACCT # за этот день.
Date Behavior 1 Behavior 2
----------------------------------------------------
2/1/2018 5 0
2/2/2018 3 0
2/3/2018 1 3
2/4/2018 0 3
2/5/2018 1 0
2/6/2018 9 5
2/7/2018 6 0
2/8/2018 3 0
2/9/2018 0 8
2/10/2018 1 0
2/11/2018 1 6