Sql вставить отсутствующие строки без совпадений

У меня проблема, когда у меня есть 1 таблица, заполненная данными и сворачиваемая по неделям, к сожалению, в таблице, из которой берутся данные, нет записи для каждого человека за каждую неделю (по многим причинам), поэтому я хотел бы для создания таблицы на основе результата 1-й временной таблицы по сравнению с временной таблицей проверки недели

Это результат первого выбора во временную таблицу

Таблица 1

Logger Name AGENT   ManagerName AGENT_ID    Week    Logs    MonthID
Logger1     Agent1  Manager1    ID1         42      25      179
Logger1     Agent1  Manager1    ID1         44      120     180
Logger1     Agent1  Manager1    ID1         45      11      180
Logger1     Agent1  Manager1    ID1         48      41      181
Logger1     Agent1  Manager1    ID1         49      223     181
Logger1     Agent1  Manager1    ID1         50      92      181

Таблица 2 (Темп. Недели) для проверки

Week    Month
40      179
41      179
42      179
43      179
44      180
45      180
46      180
47      180
48      181
49      181
50      181

Конечная таблица желаемого результата (добавлены данные для пропущенных недель из таблицы 1 с нулевым значением для журналов

Logger Name AGENT   ManagerName AGENT_ID    Week    Logs    MonthID         
Logger1     Agent1  Manager1    ID1         40      0       179
Logger1     Agent1  Manager1    ID1         41      0       179
Logger1     Agent1  Manager1    ID1         42      25      179
Logger1     Agent1  Manager1    ID1         43      0       179
Logger1     Agent1  Manager1    ID1         44      120     180
Logger1     Agent1  Manager1    ID1         45      11      180
Logger1     Agent1  Manager1    ID1         46      0       180
Logger1     Agent1  Manager1    ID1         47      0       180
Logger1     Agent1  Manager1    ID1         48      41      181
Logger1     Agent1  Manager1    ID1         49      223     181
Logger1     Agent1  Manager1    ID1         50      92      181

Может ли кто-нибудь помочь мне в создании запроса для создания этой таблицы, в таблице 1 будет много агентов, но имя журнала будет постоянным.

Временная таблица проверки недели может не потребоваться. Я просто подумал о том, чтобы как-то противостоять, и если месяц и неделя отсутствуют в таблице 1, добавьте!

Календарный стол.

Ben 11.04.2018 13:01
1
1
151
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вот один вариант. Запрос находит все комбинации агентов и недель. И удаляет недели, которые уже существуют в первой таблице. Затем вставляет оставшиеся данные

declare @t table ([Logger Name] varchar(100), AGENT varchar(100), ManagerName varchar(100), AGENT_ID varchar(100), Week int, Logs int, MonthID int)
insert into @t
values ('Logger1', 'Agent1', 'Manager1', 'ID1', 42, 25, 179)
    , ('Logger1', 'Agent1', 'Manager1', 'ID1', 44, 120, 180)
    , ('Logger1', 'Agent1', 'Manager1', 'ID1', 45, 11, 180)
    , ('Logger1', 'Agent1', 'Manager1', 'ID1', 48, 41, 181)
    , ('Logger1', 'Agent1', 'Manager1', 'ID1', 49, 223, 181)
    , ('Logger1', 'Agent1', 'Manager1', 'ID1', 50, 92, 181)

declare @q table (Week int, Month int)
insert into @q
values (40, 179), (41, 179)
    , (42, 179), (43, 179), (44, 180)
    , (45, 180), (46, 180), (47, 180)
    , (48, 181), (49, 181), (50, 181)

insert into @t
select
    distinct t.[Logger Name], t.AGENT, t.ManagerName, t.AGENT_ID, q.Week, 0, q.Month
from
    @t t
    cross join @q q
where
    not exists (
        select 1
        from
            @t f
        where
            f.AGENT = t.AGENT
            and f.Week = q.Week
            and f.MonthID = q.Month
    )

select * from @t
order by AGENT, Week

Ура, это был быстрый отклик, и он отлично работает, я все еще относительно новичок, поэтому учусь и могу как бы следовать и адаптировать это.

JPS 11.04.2018 14:12

Создайте строки с помощью cross join, затем добавьте дополнительные данные с помощью left join:

select l.*, w.*,
       coalesce(t1.logs, 0) as logs
from (select distinct LoggerName, Agent, ManagerName, AgentId
      from table1
     ) l cross join
     tempweeks w left join
     table1 t1
     on t1.LoggerName = l.LoggerName and t1.Agent = l.Agent and
        t1.ManagerName = l.ManagerName and t1.AgentId = l.AgentId and
        t1.week = w.week and t1.monthid = w.weekid;

Вы можете легко превратить это во вставку, выполнив что-то вроде:

insert into table1 ( . . . )
    select . . ., 0 as logs
    from (select distinct LoggerName, Agent, ManagerName, AgentId
          from table1
         ) l cross join
         tempweeks w left join
         table1 t1
         on t1.LoggerName = l.LoggerName and t1.Agent = l.Agent and
            t1.ManagerName = l.ManagerName and t1.AgentId = l.AgentId and
            t1.week = w.week and t1.monthid = w.weekid
    where t1.LoggerName is null;

Я уверен, что это тоже работает, но еще не было возможности протестировать, но когда будет возможность, спасибо

JPS 11.04.2018 14:12

Другие вопросы по теме