Добавление новых данных в столбцы из другой таблицы — SQL ORACLE

#sql #oracle

#sql #Oracle

Вопрос:

У меня есть таблица с некоторыми записями

ГЛАВНЫЙ СТОЛ

 x------x--------------------x-------x
| Id   |      PERIOD        |   QTY |
x------x--------------------x-------x
|  1   |   2014-01-13       |   10  |
|  2   |   2014-01-06       |   30  |
x------x--------------------x-------x
  

У меня есть другая таблица с параметрами этой записи (ID)

ТАБЛИЦА2

 x------x--------------------x------------x
| Id   |      Parameter        |   Value |
x------x--------------------x------------x
|  1   |   Humidty             |   10    |
|  1   |   Temperature         |   30    |
|  2   |   Humidty             |   50    |
|  2   |   Temperature         |   40    |
x------x--------------------x------------x
  

В результате я хочу это: (объединить на основе идентификатора)

Таблица результатов

 x------x--------------------x-------------------------x
| Id   |      Period        |   Humidty | Temperature |
x------x--------------------x-------------------------x
|  1   |   2014-01-13       |   10      | 30          |
|  2   |   2014-01-06       |   50      | 40          |
x------x--------------------x-------------------------x
  

Как я могу сделать что-то подобное? Внутреннее объединение, я думаю, не сработает.

Комментарии:

1. Преобразование строк в столбцы называется PIVOT. Поиск по всему для этого.

2. Обратите внимание, что SQL Server не является Oracle

3. Пожалуйста, не помечайте вопросы несколькими базами данных. [oracle] и [sql-server] — это разные платформы с разными синтаксисами. Все, что вы делаете, это тратите время людей, которые предоставляют решения, которые вы не можете использовать.

4. Это вопрос, который очень часто встречается в различных вариантах на этом сайте. Существуют различные решения. Какой из них лучше всего подходит для вашего случая, зависит от вашего ответа на следующий вопрос: имеет ли ваш реальный table2 (и желаемый результат) фиксированное количество атрибутов, которые всегда присутствуют для всех записей в Master таблице?

5. Здравствуйте, Да, у него есть фиксированные атрибуты, которые всегда присутствуют

Ответ №1:

Объедините таблицы и используйте условную агрегацию с case для извлечения 2 столбцов:

 select t1.id, t1.period,
  max(case when t2.parameter = 'Humidty' then t2.value end) Humidty,
  max(case when t2.parameter = 'Temperature' then t2.value end) Temperature
from mastertable t1 inner join table2 t2
on t2.id = t1.id
group by t1.id, t1.period
  

Ответ №2:

Вы можете pivot :

 SELECT * FROM 
(
SELECT 
  t_m.Id
, t_m.Period 
, t_2.Parameter
, t_2.Value
FROM @tbl_Master t_m
INNER JOIN @tbl_2 t_2 ON t_2.Id = t_m.Id
)AS t
PIVOT 
(
    MAX(t.Value)
    FOR t.Parameter IN ([Humidity], [Temperature])
)pvt
  

и примеры данных:

 DECLARE @tbl_Master TABLE
(
   Id int,
   Period Date,
   QTY int

)

DECLARE @tbl_2 TABLE
(
   Id int,
   Parameter varchar(30),
   [Value] int

)

INSERT INTO @tbl_Master
(
    Id,
    Period,
    QTY
)
VALUES
  (1, '2014-01-13', 10)
, (2, '2014-01-06', 30)


INSERT INTO @tbl_2
(
    Id ,
   Parameter ,
   [Value] 
)
VALUES
  ( 1, 'Humidity', 10)
, ( 1, 'Temperature' , 30)
, ( 2, 'Humidity', 50)
, ( 2, 'Temperature' , 40)
  

ВЫВОД:

 Id    Period    Humidity       Temperature
1   2014-01-13    10            30
2   2014-01-06    50            40
  

Ответ №3:

Попробуйте это

 DECLARE @Mastertable AS TABLE(Id INT,PERIOD DATE,QTY INT)
INSERT INTO @Mastertable
SELECT 1 ,'2014-01-13', 10  UNION ALL
SELECT 2 ,'2014-01-06', 30

DECLARE @Childtable AS TABLE(Id INT,Parameter  VARCHAR(100), Value INT)
INSERT INTO @Childtable
SELECT  1  ,'Humidty'             ,   10  UNION ALL
SELECT  1  ,'Temperature'         ,   30  UNION ALL
SELECT  2  ,'Humidty'             ,   50  UNION ALL
SELECT  2 , 'Temperature'          ,   40  

SELECT  Id,Period,[Humidty],[Temperature]
FROM
(
SELECT  c.Id,
        m.PERIOD,
        Parameter,
        c.Value
 FROM @Mastertable m
INNER JOIN  @Childtable c
ON m.Id = c.Id
) AS srC
pivot 
(MAX(Value) FOR Parameter IN ([Humidty],[Temperature])
) AS PVT
  

Результат

 Id  Period      Humidty Temperature
----------------------------------
1   2014-01-13    10      30
2   2014-01-06    50      40