SQL для извлечения строки в столбец на основе кон - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть таблица в структуре ниже. И я хочу создать sql, который может получать записи в определенном порядке.

Name	Phone	B.Email           P.Email
Jack	12      ab12@test.com	  a21@test.com
Ram	12345   null              Ram@test.com
Raja    543     Raj@test.om       null
Rik     122     null		  null

Вывод, который я хочу в следующем порядке

Name	Phone	        EMAIL			IsPrimary	EmailType
Jack	123		ab12@test.com		Y		B
Jack	123		a21@test.com		N		P
Ram	321	        Ram@test.com		Y		P
Raja	543		Raj@test.om		Y		B

если есть B.Email, то он будет основным, иначе P.Email будет основным.ЕСЛИ оба письма являются нулевыми, то этой записи не будет в выводе.

Ответы [ 4 ]

0 голосов
/ 16 ноября 2018

Попробуйте запрос ниже:

create table     Table3
(Name  varchar2(20),
phone number,
"B.mail" varchar2(50),
"P.mail" varchar2(50));

insert into Table3 values ('Jack',12,'ab12@test.com','a21@test.com');
insert into Table3 values ('Ram',12345,null,'Ram@test.com');
insert into Table3 values ('Raja',543,'Raj@test.com',null);
insert into Table3 values ('Rik',122,null,null);

SELECT Name, Phone, COALESCE("B.mail","P.mail") Email, CASE WHEN "B.mail" IS NOT NULL THEN 'Y'  ELSE 'N' END as IsPrimary,CASE WHEN "B.mail" IS NOT NULL THEN 'B'  ELSE 'P' END as EmailType
FROM Table3 t
where "B.mail" IS NOT NULL OR "P.mail" IS NOT NULL 
UNION 
SELECT Name, Phone, COALESCE("P.mail","B.mail") Email, CASE WHEN "P.mail" IS NOT NULL THEN 'N'  ELSE 'Y' END as IsPrimary,CASE WHEN "P.mail" IS NOT NULL THEN 'P'  ELSE 'B' END as EmailType
FROM Table3 t
where "B.mail" IS NOT NULL OR "P.mail" IS NOT NULL 
0 голосов
/ 16 ноября 2018

Я использовал UNION, чтобы сначала получить людей с b.email, а затем с p.email и CASE, чтобы разобраться в первичном и набрать

SELECT name, phone, b.email EMAIL, 'Y' IsPrimary,
    CASE WHEN b.email  IS NULL THEN 'P'
    ELSE 'B' 
    END EmailType
FROM mail
WHERE b.email IS NOT NULL 
UNION 
SELECT name, phone,  p.email EMAIL, 
   CASE WHEN b.email IS NULL THEN 'Y'
   ELSE 'N' 
   END IsPrimary,
   CASE WHEN b.email  IS NULL THEN 'P'
   ELSE 'B' 
   END EmailType
FROM mail
WHERE p.email IS NOT NULL 
ORDER BY name
0 голосов
/ 16 ноября 2018

Остальные ответы близки, но я думаю, что все они имеют ошибки в своих выходных данных.

Не уверен, что это за движок SQL, вот мой ответ для MySQL5.6:

SELECT name,
       phone,
       CASE WHEN BEmail IS NOT NULL THEN BEMail ELSE PEmail END as EMAIL,
       'Y' as IsPrimary,
       CASE WHEN BEmail IS NOT NULL THEN 'B' ELSE 'P' END as EmailType
FROM table_name t
WHERE NOT (BEmail IS NULL AND PEmail IS NULL)
UNION ALL
SELECT name, phone, PEmail, 'N', 'P'
from table_name
WHERE BEmail IS NOT NULL
AND PEmail IS NOT NULL
ORDER BY Name;

Обратите внимание, что я изменил B.Email на BEmail, P.Email на PEMail, и таблица называется "table_name".

SQL Fiddle здесь

0 голосов
/ 16 ноября 2018

Это то, что вы хотите?

order by phone, name, isprimary desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...