Попытка получить данные за все месяцы, но LEFT JOIN не работает - PullRequest
0 голосов
/ 17 мая 2019

Я хочу показать данные за все месяцы, даже если за этот месяц нет данных.Код ниже не работает ...

;with months (mon) as
    (select mon from (values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12)) a (mon))
SELECT c.CASE_NBR, c.SEVERITY_OF_COLLISION_ID, c.OCCURENCE_TIMESTAMP, DATEPART(MONTH, c.OCCURENCE_TIMESTAMP) AS month1, 
    CASE WHEN c.SEVERITY_OF_COLLISION_ID = '4' THEN 'Fatal Collisions' WHEN c.SEVERITY_OF_COLLISION_ID = '5' THEN 'Non-Fatal Collisions' END AS coll_severity_type, 
    CASE WHEN months.mon = '1' THEN 'January' 
         WHEN months.mon = '2' THEN 'February' 
         WHEN months.mon = '3' THEN 'March'
         WHEN months.mon = '4' THEN 'April' 
         WHEN months.mon = '5' THEN 'May' 
         WHEN months.mon = '6' THEN 'June' 
         WHEN months.mon = '7' THEN 'July' 
         WHEN months.mon = '8' THEN 'August'
         WHEN months.mon = '9' THEN 'September' 
         WHEN months.mon = '10' THEN 'October' 
         WHEN months.mon = '11' THEN 'November' 
         WHEN months.mon = '12' THEN 'December' 
     END AS month_name
FROM ECRDBA.COLLISIONS AS c
    left join months on months.mon = DATEPART(MONTH, c.OCCURENCE_TIMESTAMP)
    INNER JOIN ECRDBA.CL_OBJECTS AS o ON o.COLLISION_ID = c.ID 
    INNER JOIN ECRDBA.OBJECT_TYPES AS ot ON ot.ID = o.OBJECT_TYPE_ID 
where (c.SEVERITY_OF_COLLISION_ID NOT IN ('6')) AND (c.CASE_YEAR IN (2016)) and (ot.CODE = '06')

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Просто начните с таблицы Месяц, как показано ниже, и вы получите ожидаемый результат.

 FROM months
 LEFT JOIN  ECRDBA.COLLISIONS AS c
     ON months.mon = DATEPART(MONTH, c.OCCURENCE_TIMESTAMP)
 ......
0 голосов
/ 17 мая 2019

Ваше предложение запроса должно выглядеть следующим образом:

SELECT . . .
FROM months LEFT JOIN
     ECRDBA.COLLISIONS c 
     ON months.mon = DATEPART(MONTH, c.OCCURENCE_TIMESTAMP) AND
        c.SEVERITY_OF_COLLISION_ID NOT IN ('6') AND
        c.CASE_YEAR IN (2016) LEFT JOIN
     ECRDBA.CL_OBJECTS o
     ON o.COLLISION_ID = c.ID LEFT JOIN
     ECRDBA.OBJECT_TYPES ot
     ON ot.ID = o.OBJECT_TYPE_ID AND ot.CODE = '06'

Вам нужно начать с таблицы, в которой вы хотите сохранить все строки.Тогда последующие join с должны быть left join с, а условия для этих таблиц должны быть в предложении on, а не where.

...