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,