求SQL语句 不同条件 多个count

baibaipleo 2017-11-30 10:48:27
表 A
gid name
1 张三
2 李四
1 张二麻子
2 理查德
3 NULL
4 空
求SQL语句
一条SQL 按gid 分别统计条数
如: sql="select count(*),gid from A where gid in(1,2,4,20) group...."
我想要的结果是
count(*) gid
2 1
2 2
0 4
0 20
跪求SQL该怎么写
...全文
566 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
baibaipleo 2017-12-01
  • 打赏
  • 举报
回复
两位版主实在是太厉害了 但我最终 是用了 union all 用程序写了个循环 把SQL拼接成 多个union all 实现了 拜谢大神们 你们的SQL太高端 我真心看不懂
吉普赛的歌 版主 2017-11-30
  • 打赏
  • 举报
回复
/*
gid	cnt
1	2
2	2
20	0
4	0
*/
吉普赛的歌 版主 2017-11-30
  • 打赏
  • 举报
回复
加个表值函数就简单了:
USE tempdb
GO
IF OBJECT_ID('t') IS NOT NULL DROP TABLE t
CREATE TABLE t(gid INT,[name] NVARCHAR(10))
INSERT INTO t 
SELECT 1,'张三'
UNION ALL SELECT 2,'李四'
UNION ALL SELECT 1,'张二麻子'
UNION ALL SELECT 2,'理查德'
UNION ALL SELECT 3,NULL
UNION ALL SELECT 4,''
GO
--1. 增加一个表值函数
IF OBJECT_ID('[dbo].[Fun_Split]') IS NOT NULL DROP FUNCTION [dbo].[Fun_Split]
GO  
-- =============================================
-- Author     :	yenange
-- Create date: 2014-03-04
-- Description:	切分字符串
-- Example    : SELECT * FROM [dbo].[Fun_Split]('a,b,d,c',',')
-- =============================================
CREATE FUNCTION [dbo].[Fun_Split]  
(  
    @str    NVARCHAR(MAX),  
    @separator  NVARCHAR(MAX)  
)
RETURNS TABLE 
AS
RETURN
(
	SELECT ROW_NUMBER() OVER (order by (select 0)) AS rowNum, B.id  
	FROM   (
			SELECT [value] = CONVERT(XML, '<v>' + REPLACE(@str, @separator, '</v><v>') + '</v>')  
		   ) A  
		   OUTER APPLY(  
		SELECT id = N.v.value('.', 'nvarchar(max)')  
		FROM   A.[value].nodes('/v') N(v)  
	) B
	WHERE ISNULL(B.id,'')!=''
)
GO

--2. 查询
SELECT
	fs.id AS gid
	,SUM(CASE WHEN t.name>'' THEN 1 ELSE 0 END) AS cnt 
FROM dbo.Fun_Split('1,2,4,20',',') AS fs 
	LEFT JOIN t ON fs.id=t.gid
GROUP BY fs.id 

baibaipleo 2017-11-30
  • 打赏
  • 举报
回复
高手 ,请教简单易懂的 我只是想在程序中调用一下 SQL语句
二月十六 版主 2017-11-30
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#A') is null
drop table #A
Go
Create table #A([gid] int,[name] nvarchar(24))
Insert #A
select 1,N'张三' union all
select 2,N'李四' union all
select 1,N'张二麻子' union all
select 2,N'理查德' union all
select 3,null
Go
--测试数据结束
;WITH cte AS (
SELECT 1 AS gid
UNION
SELECT 2 AS gid
UNION
SELECT 4 AS gid
UNION
SELECT 20 AS gid
)
SELECT SUM(CASE WHEN name IS NOT NULL THEN 1
ELSE 0
END) AS cnt ,
cte.gid
FROM cte
LEFT JOIN #A ON cte.gid = #A.gid
GROUP BY cte.gid


二月十六 版主 2017-11-30
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#A') is null
drop table #A
Go
Create table #A([gid] int,[name] nvarchar(24))
Insert #A
select 1,N'张三' union all
select 2,N'李四' union all
select 1,N'张二麻子' union all
select 2,N'理查德' union all
select 3,null
Go
--测试数据结束
;WITH cte AS (
SELECT 1 AS gid
UNION
SELECT 2 AS gid
UNION
SELECT 3 AS gid
UNION
SELECT 4 AS gid
)
SELECT SUM(CASE WHEN name IS NOT NULL THEN 1
ELSE 0
END) AS cnt ,
cte.gid
FROM cte
LEFT JOIN #A ON cte.gid = #A.gid
GROUP BY cte.gid


baibaipleo 2017-11-30
  • 打赏
  • 举报
回复
select count(gid),gid from A where gid=20 group by gid order by gid asc 因为表中 没有gid=20的数据 所以 什么都不显示 但我需要结果输出0
  • 打赏
  • 举报
回复
就你那个 group by gid就可以了
baibaipleo 2017-11-30
  • 打赏
  • 举报
回复
表 A gid name 1 张三 2 李四 1 张二麻子 2 理查德 3 NULL 求SQL语句 一条SQL 按gid 分别统计条数 如: sql="select count(*),gid from A where gid in(1,2,4,20) group...." 我想要的结果是 count(*) gid 2 1 2 2 0 4 0 20 跪求SQL该怎么写
mzwhq 2017-11-30
  • 打赏
  • 举报
回复
两个版主都是大神。
cjws555 2017-11-30
  • 打赏
  • 举报
回复
引用 1 楼 baibaipleo 的回复:
表 A gid name 1 张三 2 李四 1 张二麻子 2 理查德 3 NULL 求SQL语句 一条SQL 按gid 分别统计条数 如: sql="select count(*),gid from A where gid in(1,2,4,20) group...." 我想要的结果是 count(*) gid 2 1 2 2 0 4 0 20 跪求SQL该怎么写
哈哈233
吉普赛的歌 版主 2017-11-30
  • 打赏
  • 举报
回复
引用 9 楼 baibaipleo 的回复:
select count(gid=151) from A ...... 这样的写法 报错 有没有类似这样的简单办法啊
你按我 #7 的就可以了呀, 只要加一个函数而已, 你还想怎么简单?
baibaipleo 2017-11-30
  • 打赏
  • 举报
回复
select count(gid=151) from A ...... 这样的写法 报错 有没有类似这样的简单办法啊

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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