Это классический пример сводной таблицы.Современные СУБД выполняют всю работу за вас в одном утверждении (см. Ниже).
Во-первых, нет причин разбивать данные на две таблицы на основе различия AM / PM.Это не очень хорошая идея.Даже если это упрощенная версия большого приложения с массивными данными, требующими многораздельных таблиц, вы должны настроить это так, чтобы запросы могли выполняться к одной главной таблице.
Итак, давайте поместим все данные в таблицу1.
insert into t1 values('2018-09-01',1,'AM',100),
('2018-09-01',1,'AM',120),
('2018-09-01',2,'AM',80),
('2018-09-02',1,'AM',50),
('2018-09-02',2,'AM',110),
('2018-09-01',1,'PM',110),
('2018-09-01',2,'PM',115);
Теперь давайте google для синтаксиса команды PIVOT
.(Это будет конечно отличаться для других поставщиков; я не думаю, что это является частью стандарта SQL, по крайней мере, как обычно реализуется.)
Presto!
select * FROM t1
PIVOT (SUM(weight) FOR [time] in ([AM], [PM])) AS tz;
date1 code AM PM
01/09/2018 00:00:00 1 220 110
02/09/2018 00:00:00 1 50<br>
01/09/2018 00:00:00 2 80 115
02/09/2018 00:00:00 2 110
(Вы можете использовать это как подзапрос и COALESCE
, если вам действительно нужно заменить пробелы в PM нулями. Кроме того, если вам действительно нужны две таблицы, используйте подзапрос, чтобы просто UNION
их вместе перед использованием PIVOT
.)