SQL Server: вставьте недостающие строки, чтобы в общей сложности 7 для каждого BAY - PullRequest
0 голосов
/ 10 июня 2019

Мне нужно вставить пропущенные записи со значением 0 в столбец TOP_TIER, чтобы завершить 7 записей для каждого LAST_YARD BAY значения.

Это мой простой запрос:

SELECT        
    LAST_YARD_BAY, LAST_YARD_ROW, TOP_TIER 
FROM
    MAX_TIER;

И это часть набора результатов:

enter image description here]

Как видите, у меня 7 записей (00A, 00B, 00C, 00D, 00E,00F, 00G) для BAY 005, то же самое для BAY 009 и 012, но не для BAY 007 (00E, 00F, 00G) и многих других, которые не показаны на рисунке.

Мой вопрос: как я могу вставить отсутствующие записи со значением 0 в TOP_TIER, чтобы я мог получить следующее: (для всех отсеков, а не только для отсека 007)

007    00A      0
007    00B      0
007    00C      0
007    00D      0
007    00E      05
007    00F      04
007    00G      01

Ответы [ 2 ]

2 голосов
/ 10 июня 2019

Вы можете перекрестно соединить lasr_yard_bay с last_yard_row с, чтобы получить полный набор. С NOT EXISTS вы можете отфильтровать только недостающие и вставить их.

INSERT INTO max_tier
            (last_yard_bay,
             last_yard_row,
             top_tier)
            SELECT lyb.last_yard_bay,
                   lyr.last_yard_row,
                   0 top_tier
                   FROM (SELECT DISTINCT
                                last_yard_bay
                                FROM max_tier) lyb
                        CROSS JOIN (VALUES ('00A'),
                                           ('00B'),
                                           ...
                                           ('00G')) lyr (last_yard_row)
                   WHERE NOT EXISTS (SELECT *
                                            FROM max_tier mt
                                            WHERE mt.last_yard_bay = lyb.last_yard_bay
                                                  AND mt.last_yard_row = lyr.last_yard_row);
0 голосов
/ 10 июня 2019

Я думаю, что это почти то же самое, что и ваш последний вопрос, с измененным именем таблицы и другой фильтрацией. У вас нет агрегации, поэтому она несколько отличается, но решение очень похоже:

SELECT lyb.LAST_YARD_BAY, lyr.LAST_YARD_ROW, 
       COALESCE(mt.LAST_YARD_TIER, 0) as MAX_TIER
FROM (SELECT DISTINCT LAST_YARD_BAY FROM MAX_TIER) lyb CROSS JOIN
     (SELECT DISTINCT LAST_YARD_ROW FROM MAX_TIER) lyr LEFT JOIN
     MAX_TIER mt
     ON mt.LAST_YARD_BAY = lyb.LAST_YARD_BAY AND
        mt.LAST_YARD_ROW = lyr.LAST_YARD_ROW 
ORDER BY lyr.LAST_YARD_BAY, lyr.LAST_YARD_ROW;

Предполагается, что все отсеки и строки, которые вы хотите, находятся в таблице. Если нет, вы можете использовать конструктор таблиц (т.е. VALUES()) для их генерации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...