Как отобразить объединение трех отдельных столбцов из одной и той же таблицы рядом с правильными заголовками столбцов - PullRequest
0 голосов
/ 20 мая 2019

У меня сложный запрос SQL, который возвращает правильные значения, но в неправильном формате. Мой код ниже просматривает три отдельных столбца из одной таблицы, проверяет, являются ли они нулевыми, а затем связывает их вместе. Проблема заключается в том, что все они попадают в один столбец, озаглавленный после первого столбца, который я проверил, который был столбцом «А». Мне было интересно, как я мог бы решить эту проблему форматирования. Это в основном SQL, переносящий столбец в строку своего рода.

Я провел некоторые эксперименты, чтобы получить правильные значения и подтвердил, что работает правильно. Моя единственная проблема - правильное форматирование SQL.

SELECT `A` FROM sensor, login_users, relation 
WHERE (login_users.id = relation.owner_id 
AND relation.dev_id = sensor.Device_ID) 
AND `A` IS NOT NULL

UNION 

SELECT `B` FROM sensor, login_users, relation 
WHERE (login_users.id = relation.owner_id 
AND relation.dev_id = sensor.Device_ID) 
AND `B` IS NOT NULL 

UNION 

SELECT `C` FROM sensor, login_users, relation 
WHERE (login_users.id = relation.owner_id 
AND relation.dev_id = sensor.Device_ID) 
AND `C` IS NOT NULL

Это то, что SQL-запрос возвращает

A <-- column name
--------------  
2.54  <--  A value
15.00 <--  B value
3.45  <--  C value
This is what I need it to return.

A        B        C
----     -----    -----
2.54     15.00    3.45

Кто-нибудь из удивительных людей SQL может помочь с этой проблемой форматирования? Я вообще неплохо разбираюсь с SQL, но этот меня озадачил.

Ответы [ 2 ]

1 голос
/ 20 мая 2019

похоже, что вам просто нужно повернуть.Здесь я делаю много предположений, поскольку в списке нет ни базы данных, ни набора данных.

with dat
as(
SELECT `A` as col, 'a' as spot FROM sensor, login_users, relation 
WHERE (login_users.id = relation.owner_id 
AND relation.dev_id = sensor.Device_ID) 
AND `A` IS NOT NULL

UNION 

SELECT `B` as col, 'b' as spot FROM sensor, login_users, relation 
WHERE (login_users.id = relation.owner_id 
AND relation.dev_id = sensor.Device_ID) 
AND `B` IS NOT NULL 

UNION 

SELECT `C` as col,'c' as spot FROM sensor, login_users, relation 
WHERE (login_users.id = relation.owner_id 
AND relation.dev_id = sensor.Device_ID) 
AND `C` IS NOT NULL
)
select
    case when col = 'a' then `A` end as A
    case when col = 'b' then `B` end as B
    case when col = 'c' then `C` end as C
from
    dat
0 голосов
/ 20 мая 2019

Вы, кажется, хотите только одну строку. Если так, то агрегация делает то, что вы хотите:

SELECT MAX(A), MAX(B), MAX(C)
FROM relation r JOIN
     sensor s
     ON r.dev_id = s.Device_ID JOIN
     login_users lu
     ON lu.id = r.owner_id ;

Обратите внимание на использование правильного, явного, стандартного JOIN синтаксиса.

...