1

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',如果所有NON-INTERVAL 得到'NON-INTERVAL',如果两者都有,得到'Both'

对于上面的示例,它应该返回

proposal_id   account_type
   1           INTERVAL
   2           NON-INTERVAL
   3           BOTH
4

4 回答 4

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
于 2012-04-18T15:52:11.727 回答
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
于 2012-04-18T15:45:10.680 回答
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
于 2012-04-18T15:47:05.923 回答
0
select proposal_id,
case when count(distinct account_type) > 1 then 'BOTH'
    else max(account_type)
    end
from table1
group by proposal_id

这里有提琴手

于 2012-04-18T15:57:51.587 回答