当前位置: 代码迷 >> Sql Server >> SQL server sql,看似简单哟
  详细解决方案

SQL server sql,看似简单哟

热度:50   发布时间:2016-04-24 09:42:58.0
SQL server 求一个sql,看似简单哟
tableA
id  pass
1  y
2  n
3  n
3  y
3  y

求pass等于y时id所对应的数量
结果集:
id  total
1    1
2    0
3    2
------解决思路----------------------
SELECT id,SUM(CASE pass WHEN 'y' THEN 1 ELSE 0 END) [total] 
FROM t
GROUP BY id

------解决思路----------------------
--模拟数据
;WITH tableA(id,pass)AS(
SELECT 1,'y'
UNION ALL SELECT 2,'n'
UNION ALL SELECT 3,'n'
UNION ALL SELECT 3,'y'
UNION ALL SELECT 3,'y'
)
--查询
SELECT id,COUNT(CASE pass WHEN 'y' THEN pass END)total FROM tableA GROUP BY id
--结果
/*
1 1
2 0
3 2
*/

------解决思路----------------------
数据量大的话每个明细都要做 CASE 运算不划算。
    SELECT a.id, ISNULL(b.total,0) total
      FROM (SELECT DISTINCT id FROM table1) a
 LEFT JOIN (
                SELECT id, count(*) total
                  FROM table1
                 WHERE pass = 'y'
              GROUP BY id
           ) b
        ON b.id = a.id

------解决思路----------------------
这样用group by all

use Tempdb
go
--> --> 
 
if not object_id(N'Tempdb..#tableA') is null
drop table #tableA
Go
Create table #tableA([id] int,[pass] nvarchar(1))
Insert #tableA
select 1,N'y' union all
select 2,N'n' union all
select 3,N'n' union all
select 3,N'y' union all
select 3,N'y'
Go
Select [id],COUNT(1) AS  total  from #tableA WHERE [pass]='y' GROUP BY ALL [id]
/*
id total
1 1
2 0
3 2
*/
  相关解决方案