2012-04-18 143 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