2012-04-18 5 views
1

SQL вопрос запросSQL группа запросов

У меня есть запрос, как

select proposal_id, service_id,account_type 
from table1 

Результат таков:

proposal_id service_id account_type 
    1   1001  INTERVAL 
    1   1002  INTERVAL 
    2   1003  NON INTERVAL 
    2   1004  NON INTERVAL 
    3   1005  NON INTERVAL 
    3   1006  INTERVAL 

Я хочу написать запрос: для каждого proposal_id, если все службы имеют ИНТЕРВАЛ, затем получают «ИНТЕРВАЛ», если все НЕ-ИНТЕРВАЛ получают «НЕ ИНТЕРВАЛ», если они оба получат «Оба»

Для в приведенном выше примере, он должен вернуть

proposal_id account_type 
    1   INTERVAL 
    2   NON-INTERVAL 
    3   BOTH 
+1

Если вы отправляете код, образцы XML или данных, ** PLEASE ** выделите эти строки в текстовом редакторе и нажмите кнопку «образцы кода» ('{}') на панели инструментов редактора, чтобы красиво отформатировать и выделить синтаксис Это! Тогда вам не нужны все те '
' теги и все тире вместо пространств, либо ..... –

+1

@marc_s, спасибо. – orange

ответ

3

данных:

declare @table table (id int, sid int, acc nvarchar(20)) 
insert @table VALUES (1,1001,'INTERVAL'),(1,1002,'INTERVAL'),(2,1003,'NON INTERVAL'),(2,1004,'NON INTERVAL'), 
(3,1005,'NON INTERVAL'),(3,1006,'INTERVAL') 

Запрос:

select x.Id 
    , CASE counter 
      WHEN 1 THEN x.Account_Type 
      ELSE 'BOTH' 
     END AS Account_Type 
from (
    select Id, Count(DISTINCT(acc)) AS counter, MAX(acc) As Account_Type 
    from @table 
    GROUP BY Id 
) x 

Результаты

Id   Account_Type 
----------- -------------------- 
1   INTERVAL 
2   NON INTERVAL 
3   BOTH 
+0

Smart. Спасибо. – orange

1
SELECT 
     b.proposal_id 
    ,CASE 
     WHEN s1.proposal_id IS NOT NULL AND s2.proposal_id IS NOT NULL THEN 'BOTH' 
     WHEN s1.proposal_id IS NOT NULL THEN 'INTERVAL' 
     WHEN s2.proposal_id IS NOT NULL THEN 'NON-INTERVAL' 
     ELSE 'UNKNOWN' 
    END [account_type] 
FROM table1 b 
    LEFT JOIN(
    SELECT proposal_id,account_type FROM table1 WHERE account_type = 'INTERVAL' 
    ) s1 
     ON b.proposal_id = s1.proposal_id 
    LEFT JOIN (
    SELECT proposal_id,account_type FROM table1 WHERE account_type = 'NON-INTERVAL' 
    )s2 
     ON b.proposal_id = s2.proposal_id 
+0

Это, безусловно, можно сделать. Но я предпочитаю решение без самообучения. Все же разрешите поблагодарить вас. – orange

+0

Другое решение лучше. – jh0486

1

Вы можете использовать count distinct детерминированным, если он и затем использовать CASE детерминированным, что для отображения

SELECT DISTINCT proposal.proposal_id, 
     CASE cou 
      WHEN 1 THEN type ELSE 'Both' END as TYPE 
FROM proposal 
INNER JOIN (SELECT proposal_id, count(distinct type) cou 
      FROM proposal GROUP BY proposal_id) inn 
     ON proposal.id = inn.id 
+0

Спасибо, ответ подобен с @Paddy's. – orange

0
select proposal_id, 
case when count(distinct account_type) > 1 then 'BOTH' 
    else max(account_type) 
    end 
from table1 
group by proposal_id 

У вас есть fiddler here.

+0

Спасибо. Но сначала Пэдди. – orange

Смежные вопросы