Заполняя пропущенные строки, ПРАВИЛЬНО ПРИСОЕДИНЯЙТЕСЬ к каждой группе GROUP BY - PullRequest
0 голосов
/ 29 апреля 2018

На одной таблице у меня есть Id и имя из 10 тестов, которые нужно сделать. На втором продукте SN, TestDate и Id test, которые были выполнены для этого продукта. Мне нужно найти и показать тесты, которые должны быть выполнены, но это не так.

Решение с CROSS JOIN и LEFT OUTER JOIN работает для 1000 строк, но для 8000-15000 это занимает длительное время 1-3 минуты. Данные подготовлены по запросу CTE

пример ниже Я хочу добавить «пропущенную» строку в каждую группу @ Table2

@Table1 => four tests which should be done 
       number - Id of test
       data3  -name of test
@Table2 => tests which were done
       data1 - id of tested device
GROUP   => tests of one device

DECLARE @table1 TABLE (data3 NVARCHAR(20), number INT)
DECLARE @table2 TABLE (data1 NVARCHAR(20), data2 NVARCHAR(20), number INT)  

INSERT INTO @table1 
    SELECT 'xx', 1 
    UNION ALL 
    SELECT 'ee', 2 
    UNION ALL 
    SELECT 'zz', 3 
    UNION ALL 
    SELECT 'gg', 4

INSERT INTO @table2 
    SELECT '1', 'aaaaaaaaaa', 1 --GROUP 1
    UNION ALL 
    SELECT '1', 'aaaaaaaaaa', 2 --GROUP 1
    UNION ALL 
    SELECT '1', 'aaaaaaaaaa', 3 --GROUP 1
    UNION ALL 
    SELECT '2', 'bbbbbbbbbb', 1 --GROUP 2
    UNION ALL 
    SELECT '2', 'bbbbbbbbbb', 2 --GROUP 2
    UNION ALL 
    SELECT '3', 'cccccccccc', 1 --GROUP 3
    UNION ALL 
    SELECT '3', 'cccccccccc', 3 --GROUP 3

С этим запросом была добавлена ​​только одна строка (первая), мне нужно заполнить каждую группу таблицы2

Если моя группа, например, GROUP BY data1, data2

SELECT * 
FROM @table2 t2
RIGHT JOIN @table1 t1 ON t2.number = t1.number
ORDER BY t2.data1, t1.number

Выход:

 data1  data2       number  data3   number
 -----------------------------------------
 NULL   NULL        NULL    gg      4
 1      aaaaaaaaaa  1       xx      1
 1      aaaaaaaaaa  2       ee      2
 1      aaaaaaaaaa  3       zz      3
 2      bbbbbbbbbb  1       xx      1
 2      bbbbbbbbbb  2       ee      2
 3      cccccccccc  3       zz      3
 3      cccccccccc  1       xx      1

Это мой требуемый вывод (хотя будет работать только один столбец «число»)

 data1  data2       number  number3
 -----------------------------------------
 1      aaaaaaaaaa  1       1          --GROUP 1
 1      aaaaaaaaaa  2       2          --GROUP 1
 1      aaaaaaaaaa  3       3          --GROUP 1
 NULL   NULL        NULL    4          --GROUP 1
 2      bbbbbbbbbb  1       1          --GROUP 2
 2      bbbbbbbbbb  2       2          --GROUP 2
 NULL   NULL        NULL    3          --GROUP 2
 NULL   NULL        NULL    4          --GROUP 2
 3      cccccccccc  1       1          --GROUP 3
 NULL   NULL        NULL    2          --GROUP 3
 3      cccccccccc  3       3          --GROUP 3
 NULL   NULL        NULL    4          --GROUP 3

1 Ответ

0 голосов
/ 29 апреля 2018

Почему ваши data1 равны нулю для пропущенных значений? Я думаю, они должны быть заполнены из таблицы2. Попробуйте этот запрос:

;with cte as (
    select
        distinct a.data1, b.number, b.data3
    from
        @table2 a
        cross join @table1 b
)

select
    c.data1, t.data2, t.number, c.data3, number3 = c.number
from
    cte c
    left join @table2 t on c.data1 = t.data1 and c.number = t.number

выход

data1   data2        number   data3   number3
---------------------------------------------
1       aaaaaaaaaa   1        xx      1
1       aaaaaaaaaa   2        ee      2
1       aaaaaaaaaa   3        zz      3
1       NULL         NULL     gg      4
2       bbbbbbbbbb   1        xx      1
2       bbbbbbbbbb   2        ee      2
2       NULL         NULL     zz      3
2       NULL         NULL     gg      4
3       cccccccccc   1        xx      1
3       NULL         NULL     ee      2
3       cccccccccc   3        zz      3
3       NULL         NULL     gg      4

Если вам действительно необходимо отобразить нулевые значения в столбце data1, добавьте оператор case, чтобы проверить значение data2.

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