#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