Servesh Tiwari Ответов: 1

Как извлечь учетную запись из таблицы в SQL developer db, которая имеет несколько пакетов на одной учетной записи.


я хочу получить учетную запись из БД, которая имеет несколько пакетов, отличных от телевизора, например
Таблица Т1
пакеты счетов
111 ТВ
111 широкополосная связь
111 мобильный телефон
112 ТВ
112 широкополосный
112 СТБ
112 с мобильного
115 стационарный телефон
115 широкополосный
115 СТБ
115 мобильного
Как извлечь из приведенной выше таблицы счет, который не имеет пакета TV ??

Что я уже пробовал:

Select Account,Item from T1 where item not in('TV')
AND Account NOT IN (select distinct Accountfrom T1 where item= ('TV')); 

1 Ответов

Рейтинг:
0

CHill60

Вопрос в посте не соответствует названию, так что, надеюсь, один из следующих вопросов-это то, что вам на самом деле нужно.

Получить аккаунт, не имеющий пакета "ТВ" - ваша попытка была очень близка кстати -

Select DISTINCT Account from T1 where Account NOT IN (select distinct Account from T1 where item= ('TV')); 
Чтобы получить учетные записи, имеющие несколько пакетов -
Select Account from T1 GROUP BY Account HAVING COUNT(item) > 1
Чтобы получить пакеты для каждого счета в табличном формате -
SELECT * FROM
( select Account, Item FROM T1 ) qry
PIVOT (	count(Item) for Item IN (TV,broadband, mobile, STB, Landline) ) pvt
что дало бы следующий результат
Account TV   broadband mobile  STB     Landline
111	1	1	1	0	0
112	1	1	1	1	0
115	0	1	1	1	1
и очевидно, что если вы хотите перечислить учетные записи, у которых нет телевизора в этом формате, просто добавьте
WHERE TV = 0
Чтобы получить пакеты для каждой учетной записи в виде списка разделенного запятыми сделайте это
SELECT DISTINCT a.Account,
	Packages = STUFF((SELECT ',' + b.Item FROM T1 b
                WHERE a.Account = b.Account FOR XML Path('')),1,1,'')
FROM T1 a
Или если вы не можете использовать STUFF/FOR XML попробуйте
SELECT Account, CASE WHEN TV = 1 THEN 'TV,' ELSE '' END + 
				CASE WHEN broadband = 1 THEN 'Broadband,' ELSE '' END +
				CASE WHEN mobile = 1 THEN 'Mobile,' ELSE '' END +
				CASE WHEN STB = 1 THEN 'STB,' ELSE '' END + 
				CASE WHEN Landline = 1 THEN 'Landline,' ELSE '' END AS Packages
FROM
( select Account, Item FROM T1 ) qry
PIVOT (	count(Item) for Item IN (TV,broadband, mobile, STB, Landline) ) pvt
что дает результаты
Account Packages
111	TV,Broadband,Mobile,
112	TV,Broadband,Mobile,STB,
115	Broadband,Mobile,STB,Landline,