比例统计

czyoooo 2017-02-18 08:18:49

ID NAME EAT1 EAT2
1 A 苹果 桔子
2 B 苹果 桔子
3 A 梨子 苹果
4 A 梨子 香蕉
5 A 杨桃 火龙果
6 B 火龙果 桔子
查询:吃苹果的比例
A 2/4
B 1/2
...全文
258 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wwfxgm 2017-02-19
  • 打赏
  • 举报
回复
都是高人。这么复杂的代码。
中国风 2017-02-18
  • 打赏
  • 举报
回复
HAVING SUM(CASE WHEN N'苹果' IN ([EAT1],[EAT2]) THEN 1 ELSE 0 END )>2; ---在HAVING限制结果集条件
中国风 2017-02-18
  • 打赏
  • 举报
回复
引用 2 楼 czyoooo 的回复:
如果 吃苹果次数要求大于2次的呢?
>=2次 e.g.
use Tempdb
go
--> --> 中国风(Roy)生成測試數據
 
if not object_id(N'Tempdb..#1') is null
	drop table #1
Go
Create table #1([ID] int,[NAME] nvarchar(21),[EAT1] nvarchar(23),[EAT2] nvarchar(23))
Insert #1
select 1,N'A',N'苹果',N'桔子' union all
select 2,N'B',N'苹果',N'桔子' union all
select 3,N'A',N'梨子',N'苹果' union all
select 4,N'A',N'梨子',N'香蕉' union all
select 5,N'A',N'杨桃',N'火龙果' union all
select 6,N'B',N'火龙果',N'桔子'
Go
SELECT  [NAME] ,
       RTRIM(SUM(CASE WHEN N'苹果' IN ([EAT1],[EAT2])   THEN 1
                       ELSE 0
                  END ))+'/' +RTRIM(COUNT(*)) AS Count1
FROM    #1
GROUP BY [NAME]
HAVING SUM(CASE WHEN N'苹果' IN ([EAT1],[EAT2])   THEN 1
                       ELSE 0
                  END )>=2;

/*
NAME	Count1
A	2/4
*/
二月十六 2017-02-18
  • 打赏
  • 举报
回复
大于2的
--测试数据
;WITH tab(ID,NAME,EAT1,EAT2) AS (
 select 1,'A','苹果','桔子' union all
 select 2,'B','苹果','桔子' union all
 select 3,'A','梨子','苹果' union all
 select 4,'A','梨子','香蕉' union all
 select 5,'A','杨桃','火龙果' union all
 select 6,'B','火龙果','桔子'
)
--测试数据结束
SELECT  a.NAME ,
        CONVERT(NVARCHAR(100), ( SELECT COUNT(1)
                                 FROM   tab b
                                 WHERE  a.NAME = b.NAME
                                        AND ( b.EAT1 = '苹果'
                                              OR b.EAT2 = '苹果'
                                            )
                                 GROUP BY b.NAME
                               )) + '/' + CONVERT(NVARCHAR(100), ( SELECT
                                                              COUNT(1)
                                                              FROM
                                                              tab b
                                                              WHERE
                                                              a.NAME = b.NAME
                                                              GROUP BY b.NAME
                                                              )) AS 吃苹果的比例
FROM    tab a
WHERE ( SELECT COUNT(1)
                                 FROM   tab b
                                 WHERE  a.NAME = b.NAME
                                        AND ( b.EAT1 = '苹果'
                                              OR b.EAT2 = '苹果'
                                            )
                                 GROUP BY b.NAME
                               )>2
GROUP BY a.NAME;
二月十六 2017-02-18
  • 打赏
  • 举报
回复
语句:
--测试数据
;WITH tab(ID,NAME,EAT1,EAT2) AS (
select 1,'A','苹果','桔子' union all
select 2,'B','苹果','桔子' union all
select 3,'A','梨子','苹果' union all
select 4,'A','梨子','香蕉' union all
select 5,'A','杨桃','火龙果' union all
select 6,'B','火龙果','桔子'
)
--测试数据结束
SELECT a.NAME ,
CONVERT(NVARCHAR(100), ( SELECT COUNT(1)
FROM tab b
WHERE a.NAME = b.NAME
AND ( b.EAT1 = '苹果'
OR b.EAT2 = '苹果'
)
GROUP BY b.NAME
)) + '/' + CONVERT(NVARCHAR(100), ( SELECT
COUNT(1)
FROM
tab b
WHERE
a.NAME = b.NAME
GROUP BY b.NAME
)) AS 吃苹果的比例
FROM tab a
GROUP BY a.NAME;



结果:





唐诗三百首 2017-02-18
  • 打赏
  • 举报
回复
引用 2 楼 czyoooo 的回复:
如果 吃苹果次数要求大于2次的呢?

select a.NAME,
       吃苹果的比例=rtrim(sum(case when EAT1='苹果' or EAT2='苹果' then 1 else 0 end))+'/'+rtrim(count(1))
 from #t a
 group by a.NAME
 having sum(case when EAT1='苹果' or EAT2='苹果' then 1 else 0 end)>2
czyoooo 2017-02-18
  • 打赏
  • 举报
回复
如果 吃苹果次数要求大于2次的呢?
唐诗三百首 2017-02-18
  • 打赏
  • 举报
回复

create table #t(ID int,NAME varchar(10),EAT1 varchar(10),EAT2 varchar(10))

insert into #t(ID,NAME,EAT1,EAT2)
 select 1,'A','苹果','桔子' union all
 select 2,'B','苹果','桔子' union all
 select 3,'A',' 梨子','苹果' union all
 select 4,'A','梨子','香蕉' union all
 select 5,'A','杨桃','火龙果' union all
 select 6,'B','火龙果','桔子'


select a.NAME,
       吃苹果的比例=rtrim(sum(case when EAT1='苹果' or EAT2='苹果' then 1 else 0 end))+'/'+rtrim(count(1))
 from #t a
 group by a.NAME

/*
NAME       吃苹果的比例
---------- -------------------------
A          2/4
B          1/2

(2 row(s) affected)
*/

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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