Добавить отсутствующие элементы в таблицу из другой таблицы SQL Server - PullRequest
0 голосов
/ 22 марта 2019

У меня есть 2 таблицы:

Первая таблица [Table_Time]:

Month Number    Week Number
------------    -----------
1               01
1               02
1               03
1               04
2               05
2               06
2               07
2               08
3               09
3               10
3               11
3               12

Вторая таблица [Sales]:

Product         Store           Month Number    Week Number
------------    -----------     ------------    -----------
P1              ST1             1               03
P1              ST1             1               04
P1              ST1             2               05
P1              ST1             3               09
P1              ST1             3               11
P1              ST1             3               12

Мой вопрос:

Как добавить недостающие недели в таблицу [Продажи]?

Мой ожидаемый результат должен быть:

Product         Store           Month Number    Week Number
------------    -----------     ------------    -----------
P1              ST1             1               01
P1              ST1             1               02
P1              ST1             1               03
P1              ST1             1               04
P1              ST1             2               05
P1              ST1             2               06
P1              ST1             2               07
P1              ST1             2               08
P1              ST1             3               09
P1              ST1             3               10
P1              ST1             3               11
P1              ST1             3               12

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 22 марта 2019

Вы можете сделать INSERT с «анти-объединением», как в:

insert into sales (product, store, month_number, week_number)
select 'P1', 'ST1', t.month_number, t.week_number
from table_time t
left join sales s on t.month_number = s.month_number
                 and t.week_number = s.week_number
where s.month_number is null and s.week_number is null
1 голос
/ 22 марта 2019

Если у вас есть таблица магазинов и продуктов, просто используйте как CROSS JOIN:

USE Sandbox;
GO
CREATE TABLE Table_time (MonthNumber int,
                         WeekNumber int);
INSERT INTO dbo.Table_time (MonthNumber,
                            WeekNumber)
VALUES (1,01),
       (1,02),
       (1,03),
       (1,04),
       (2,05),
       (2,06),
       (2,07),
       (2,08),
       (3,09),
       (3,10),
       (3,11),
       (3,12);

CREATE TABLE Store (StoreID varchar(3));
INSERT INTO Store (StoreID)
VALUES ('ST1'),('ST2');
GO

CREATE TABLE Product (ProductID varchar(2));
INSERT INTO Product
VALUES('P1'),('P2'),('P3'),('P4');
GO

SELECT *
FROM Table_time
     CROSS JOIN Product
     CROSS JOIN Store;
GO

Если вы хотите агрегировать, вы можете добавить LEFT JOIN к вашей таблице sales:

SELECT TT.MonthNumber,
       TT.MonthNumber,
       P.ProductID,
       S.StoreID,
       COUNT(SS.ID) 
FROM Table_time TT
     CROSS JOIN Product P
     CROSS JOIN Store S
     LEFT JOIN Sales SS ON TT.MonthNumber = SS.MonthNumber
                       AND TT.WeekNumber = SS.WeekNumber
                       AND P.ProductID = SS.ProductID
                       AND S.StoreID = SS.StoreID;
1 голос
/ 22 марта 2019

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

WITH AllProducts AS( --This can be avoided if you already have a list of them outside of Sales
    SELECT DISTINCT Product, Store
    FROM Sales
)
SELECT p.Product,
       p.Store,
       t.MonthNumber,
       t.WeekNumber
FROM AllProducts p
CROSS JOIN Table_Time t
EXCEPT
SELECT s.Product,
       s.Store,
       s.MonthNumber,
       s.WeekNumber
FROM Sales s;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...