一条查询语句查多个count应该怎么查

墨染眸 2017-06-01 03:10:14
ID STATE
2 1
2 2
2 1

3 2
3 1
3 1
我想查出来这种效果
ID STATE=1 STATE=2
2 2 1
3 2 1


请问这样的HQL或者SQL语句应该怎么写,
...全文
285 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 2017-06-01
  • 打赏
  • 举报
回复
有测试数据直接用这句,把#T换成对应的表名
;WITH cte AS (
Select ID,STATE,COUNT(STATE) AS num from #T GROUP BY ID,STATE
)
SELECT  a.ID ,
        a.num AS [STATE=1] ,
        b.num AS [STATE=2]
FROM    cte a
        JOIN cte b ON b.ID = a.ID
                      AND a.STATE = 1
                      AND b.STATE = 2
墨染眸 2017-06-01
  • 打赏
  • 举报
回复
引用 4 楼 sinat_28984567 的回复:
[quote=引用 2 楼 u013243610 的回复:] [quote=引用 1 楼 sinat_28984567 的回复:]
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([ID] int,[STATE] int)
Insert #T
select 2,1 union all
select 2,2 union all
select 2,1 union all
select 3,2 union all
select 3,1 union all
select 3,1
Go
--测试数据结束
;WITH cte AS (
Select ID,STATE,COUNT(STATE) AS num from #T GROUP BY ID,STATE
)
SELECT  a.ID ,
        a.num AS [STATE=1] ,
        b.num AS [STATE=2]
FROM    cte a
        JOIN cte b ON b.ID = a.ID
                      AND a.STATE = 1
                      AND b.STATE = 2

小白表示有点看不懂[/quote] 上边那个with as 是先统计出来每个id每个state有多少个。然后下边是按照规则显示出来[/quote] 换成一句普通的SQL语句应该怎么写,假设已经有了测试数据,怎么用一句sql查出来
二月十六 2017-06-01
  • 打赏
  • 举报
回复
引用 2 楼 u013243610 的回复:
[quote=引用 1 楼 sinat_28984567 的回复:]
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([ID] int,[STATE] int)
Insert #T
select 2,1 union all
select 2,2 union all
select 2,1 union all
select 3,2 union all
select 3,1 union all
select 3,1
Go
--测试数据结束
;WITH cte AS (
Select ID,STATE,COUNT(STATE) AS num from #T GROUP BY ID,STATE
)
SELECT  a.ID ,
        a.num AS [STATE=1] ,
        b.num AS [STATE=2]
FROM    cte a
        JOIN cte b ON b.ID = a.ID
                      AND a.STATE = 1
                      AND b.STATE = 2

小白表示有点看不懂[/quote] 上边那个with as 是先统计出来每个id每个state有多少个。然后下边是按照规则显示出来
二月十六 2017-06-01
  • 打赏
  • 举报
回复
或者这样也行
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([ID] int,[STATE] int)
Insert #T
select 2,1 union all
select 2,2 union all
select 2,1 union all
select 3,2 union all
select 3,1 union all
select 3,1
Go
--测试数据结束
;WITH cte AS (
Select ID,STATE,COUNT(STATE) AS num from #T GROUP BY ID,STATE
)
SELECT ID ,
MAX(CASE WHEN STATE = 1 THEN num
ELSE 0
END) AS [STATE=1] ,
MAX(CASE WHEN STATE = 2 THEN num
ELSE 0
END) AS [STATE=1]
FROM cte
GROUP BY ID



墨染眸 2017-06-01
  • 打赏
  • 举报
回复
引用 1 楼 sinat_28984567 的回复:
--测试数据
if not object_id(N'Tempdb..#T') is null
	drop table #T
Go
Create table #T([ID] int,[STATE] int)
Insert #T
select 2,1 union all
select 2,2 union all
select 2,1 union all
select 3,2 union all
select 3,1 union all
select 3,1
Go
--测试数据结束
;WITH cte AS (
Select ID,STATE,COUNT(STATE) AS num from #T GROUP BY ID,STATE
)
SELECT  a.ID ,
        a.num AS [STATE=1] ,
        b.num AS [STATE=2]
FROM    cte a
        JOIN cte b ON b.ID = a.ID
                      AND a.STATE = 1
                      AND b.STATE = 2

小白表示有点看不懂
二月十六 2017-06-01
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([ID] int,[STATE] int)
Insert #T
select 2,1 union all
select 2,2 union all
select 2,1 union all
select 3,2 union all
select 3,1 union all
select 3,1
Go
--测试数据结束
;WITH cte AS (
Select ID,STATE,COUNT(STATE) AS num from #T GROUP BY ID,STATE
)
SELECT a.ID ,
a.num AS [STATE=1] ,
b.num AS [STATE=2]
FROM cte a
JOIN cte b ON b.ID = a.ID
AND a.STATE = 1
AND b.STATE = 2



10,607

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 其他
社区管理员
  • 其他
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧