SQL Server: объединить таблицу CALENDAR и таблицу DATA - PullRequest
0 голосов
/ 21 марта 2019

Может кто-нибудь сказать мне, почему я не могу присоединить эти таблицы?Первая таблица представляет собой динамическую таблицу 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


1 Ответ

0 голосов
/ 21 марта 2019

Несмотря на использование FULL JOIN, вы получите только те строки, которые существуют в vw_MaladaptiveDailySummary, потому что вы ссылаетесь на них в предложении WHERE:

vwMals.Date >= @start AND vwMals.date <= @end 
AND Account# = @FSH
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...