2012-04-18 60 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,如果所有的服務都有INTERVAL然後得到'INTERVAL',如果所有的非INTERVAL得到'非INTERVAL',如果兩者都得到'Both'

For上面的例子中,它應該返回

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

如果您發佈代碼,XML或數據樣本,請**在文本編輯器中突出顯示這些行,然後單擊編輯器工具欄上的「代碼示例」按鈕(「{}」)以良好地格式化和語法突出顯示它!那麼你不需要所有'
'標籤和所有破折號而不是空格,或者...... – 2012-04-18 15:38:47

+1

@marc_s,謝謝。 – orange 2012-04-18 15:44:08

回答

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

聰明。謝謝。 – orange 2012-04-18 16:00:21

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 2012-04-18 15:59:03

+0

另一種解決方案更好。 – jh0486 2012-04-18 16:00:07

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的相似。 – orange 2012-04-18 16:00:08

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 2012-04-18 17:57:11