SQL Server: заполните значение MAX (столбец) 0 для несуществующих строк - PullRequest
2 голосов
/ 10 июня 2019

Я хочу вернуть 0 для MAX_TIER для несуществующих строк в таблице

Это мой код:

SELECT   
    LAST_YARD_BAY, LAST_YARD_ROW, MAX(LAST_YARD_TIER) as MAX_TIER
FROM
    Handlift
WHERE 
    HDCHKOUTD_OUT IS NULL 
    AND LIFLAG = 'A'
    AND LAST_YARD_PARK = 'J1'
GROUP BY 
    LAST_YARD_BAY, LAST_YARD_ROW
ORDER BY 
    LAST_YARD_BAY, LAST_YARD_ROW;

На снимке экрана показана часть результата:

enter image description here

Для Bay 005 У меня MAX_TIER для ROWS 00A до 00G, но для Bay 007 у меня только 3 ряда:00E, 00F и 00G.

Как можно заполнить MAX_TIER значением 0 для 4 пропущенных строк (00A, 00B, 00C и 00D)залива 007 и других пропущенных строк?

Ответы [ 2 ]

1 голос
/ 10 июня 2019

Это то, что вы ищете?

SELECT *
FROM T
WHERE LastYardBay = '005'
UNION
SELECT '007',
       T1.LastYardRow,
       ISNULL(T2.MaxTier, 0)
FROM 
    (
      SELECT *
      FROM T
      WHERE LastYardBay = '005'
    ) T1
    LEFT JOIN
    (
      SELECT *
      FROM T
      WHERE LastYardBay = '007'
    ) T2
ON T1.LastYardRow = T2.LastYardRow;

Возвращает:

+-------------+-------------+---------+
| LastYardBay | LastYardRow | MaxTier |
+-------------+-------------+---------+
|         005 | 00A         |       3 |
|         005 | 00B         |       4 |
|         005 | 00C         |       1 |
|         005 | 00D         |       1 |
|         005 | 00E         |       1 |
|         005 | 00F         |       4 |
|         005 | 00G         |       1 |
|         007 | 00A         |       0 |
|         007 | 00B         |       0 |
|         007 | 00C         |       0 |
|         007 | 00D         |       0 |
|         007 | 00E         |       5 |
|         007 | 00F         |       4 |
|         007 | 00G         |       1 |
+-------------+-------------+---------+

Демонстрация в реальном времени


UPDATE:

Поскольку у вас уже есть '005', вам нужно просто CROSS JOIN, а затем отфильтровать с IS NULL как

WITH A AS
(
SELECT       T1.LastYardBay LYB1,
             T1.LastYardRow LYR1,
             T1.MaxTier MT1,
             T2.LastYardBay LYB2,
             T2.LastYardRow LYR2,
             T2.MaxTier MT2
FROM 
    (
      SELECT *
      FROM T
      WHERE LastYardBay = '005'
    ) T1
    CROSS JOIN
    (
      SELECT *
      FROM T
      WHERE LastYardBay != '005'
    ) T2
)
SELECT *
FROM T
WHERE LastYardBay = '005'
UNION
SELECT  LYB2,
        LYR1,   
        CASE WHEN LYR2 = LYR1 THEN MT2 ELSE 0 END MT
FROM A LEFT JOIN T ON A.LYB2 IS NULL;
1 голос
/ 10 июня 2019

Используйте CROSS JOIN для генерации строк и LEFT JOIN для получения результатов:

SELECT lyb.LAST_YARD_BAY, lyr.LAST_YARD_ROW, 
       COALESCE(MAX(LAST_YARD_TIER), 0) as MAX_TIER
FROM (SELECT DISTINCT LAST_YARD_BAY FROM Handlift) lyb CROSS JOIN
     (SELECT DISTINCT LAST_YARD_ROW FROM Handlift) lyr LEFT JOIN
     Handlift hl
     ON hl.LAST_YARD_BAY = lyb.LAST_YARD_BAY AND
        hl.LAST_YARD_ROW = lyr.LAST_YARD_ROW AND
        hl.HDCHKOUTD_OUT IS NULL AND
        hl.LIFLAG = 'A' AND
        hl.LAST_YARD_PARK = 'J1'
GROUP BY lyb.LAST_YARD_BAY, lyr.LAST_YARD_ROW
ORDER BY lyr.LAST_YARD_BAY, lyr.LAST_YARD_ROW;

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

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