SQL-запрос не возвращает все месяцы - PullRequest
0 голосов
/ 23 сентября 2019

У меня проблема с отображением дат

Таблица # даты включает только монеты 2-летней давности для представления в форме (2018-01, 2018-02, 2018-03 и т. Д.) Таблица QA_Ratio включает в себя предметы и они подсчитывают производство в месяцНекоторый месяц товар не производился (в QA_Ratio это НЕ рекорд).Но если я оставляю присоединение таблицы #dates к QA_Ratio и отфильтровываю по конкретному элементу, в продуктах все еще есть только месяцы, и я хочу показать каждый месяц даже без записи (например, с NULL).Вот код:

   Select
    #dates.frame
     ,Material 
     ,NG_qty 
     ,Ratio
    FROM QA_Ratio
    Left join #dates ON #dates.frame = QA_Ratio.frame COLLATE Czech_CI_AS
    Where Material = '3p326040-2 V'
Order by frame

Это шоу

2018-05 3P326040-2 V        0   0
2018-06 3P326040-2 V        0   0
2018-07 3P326040-2 V        0   0
2018-08 3P326040-2 V        0   0
2018-09 3P326040-2 V        0   0
2018-10 3P326040-2 V        13  1
2018-11 3P326040-2 V        65  1
2018-12 3P326040-2 V        550 8
2019-01 3P326040-2 V        503 240
2019-02 3P326040-2 V        187 19
2019-03 3P326040-2 V        402 4
2019-04 3P326040-2 V        202 6
2019-07 3P326040-2 V        2   0

То есть не 2019-05, а 2019-06.Как включить отсутствующие мотыльки?

Thx

1 Ответ

0 голосов
/ 23 сентября 2019

Ваша основная проблема заключается в том, что вам нужно взять таблицу #dates и затем присоединиться к QA_Ratio.

Таким образом, вы получите все даты и NULL-ы в несоединенных строках.

Чем мы только отформатируем результаты с ISNULL в select.

DECLARE @date_from  DATE =  '2018-01-01'
DECLARE @type       NVARCHAR(32) =  '3p326040-2 V'

SELECT
    frame       =   d.frame
,   Material    =   ISNULL(qar.Material , @type)
,   NG_qty      =   ISNULL(qar.NG_qty   , 0)
,   Ratio       =   ISNULL(qar.Ratio    , 0)
FROM    
                #dates      AS d
    LEFT JOIN   QA_Ratio    AS qar  ON  qar.frame = d.frame
                                    AND qar.Material = @type
WHERE   1 = 1
    AND d.frame >= @date_from
ORDER BY
    d.frame
...