Повторите те же данные определенное количество раз - PullRequest
0 голосов
/ 11 июля 2019

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

У меня есть таблица названий продуктов, мест их расположения и различных статусов (от 1 до 10). У меня есть данные для всех продуктов и местоположений, но только некоторые из статусов (например, продукт X в городе XX имеет данные для категорий 1 и 3, а продукт Y для города YY имеет данные для категорий 1–6).

Я хотел бы всегда отображать 10 повторений каждого продукта / местоположения с соответствующими данными (если они есть) или нулями. Это делает отчет, который я планирую создать, намного проще для чтения и понимания.

Я использую SSMS2017, на SQL Server 2016.

SELECT 
[Product],
[Location],
[Category],
[Week1],
[Week2],
[Week3]
FROM MyView

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

1 Ответ

3 голосов
/ 11 июля 2019

Ваш вопрос не очень ясен, но я думаю, что мой магический хрустальный шар дал мне хорошее предположение:

Я думаю, что вы ищете LEFT JOIN и CROSS JOIN:

- В следующий раз, пожалуйста, создайте автономный образец, подобный этому
- Я создаю 3 фиктивных таблицы с образцами данных

DECLARE @tblStatus TABLE(ID INT IDENTITY,StatusName VARCHAR(100));
INSERT INTO @tblStatus VALUES('Status 1')
                            ,('Status 2')
                            ,('Status 3')
                            ,('Status 4')
                            ,('Status 5');
DECLARE @tblGroup TABLE(ID INT IDENTITY,GroupName VARCHAR(100));
INSERT INTO @tblGroup VALUES ('Group 1')
                            ,('Group 2')
                            ,('Group 3')
                            ,('Group 4')
                            ,('Group 5');
DECLARE @tblProduct TABLE(ID INT IDENTITY,ProductName VARCHAR(100),StatusID INT, GroupID INT);
INSERT INTO @tblProduct VALUES ('Product 1, Status 1, Group 2',1,2)
                              ,('Product 2, Status 1, Group 3',1,3)
                              ,('Product 3, Status 3, Group 4',3,4)
                              ,('Product 4, Status 3, Group 3',3,3)
                              ,('Product 5, Status 1, Group 5',1,5);

- Возвращает каждый статус (независимо от значений продукта) вместе с продуктами (если есть соответствующая строка)

SELECT s.StatusName
      ,p.*
FROM @tblStatus s
LEFT JOIN @tblProduct p ON s.ID=p.StatusID                           

- Сначала будет использоваться CROSS JOIN для создания декартового произведения каждый с каждым.
- LEFT JOIN работает как указано выше

SELECT s.StatusName
      ,g.GroupName
      ,p.*
FROM @tblStatus s
CROSS JOIN @tblGroup g
LEFT JOIN @tblProduct p ON s.ID=p.StatusID AND g.ID=p.GroupID;

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

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