采用COUNT(*) OVER(PARTITION BY 字段)的分组查询,请帮看下

ccshigenvwa 2011-02-15 03:53:14

现有数据,利用分组统计各个地区或各个乡镇的人数
ID a b stu
1 地区1 乡镇11 学生1
2 地区2 乡镇21 学生2
3 地区1 乡镇12 学生3
4 地区2 乡镇22 学生4
5 地区1 乡镇13 学生5
6 地区2 乡镇21 学生6
7 地区1 乡镇11 学生7
8 地区2 乡镇23 学生8
9 地区1 乡镇12 学生9
10 地区2 乡镇22 学生10


数据库版本是sql2005
SELECT DISTINCT a,COUNT(STU) OVER(PARTITION BY a) AS TotalMan FROM TempDBa
SELECT DISTINCT b,COUNT(STU) OVER(PARTITION BY b) AS TotalMan FROM TempDBa
通过这两个语句可以完成,但是我现在想写一个通用的方法只需要传递参数就可以进行分组,这个如何做?

我的思路是

DECLARE @v varchar(100)
set @v='a' --就是在这里获取不同的值,查询的结果分组也不同
SELECT DISTINCT @v,COUNT(STU) OVER(PARTITION BY @v) AS TotalMan FROM TempDBa

我写的这个当然无法实现,请问有好的办法么
采用exec好像可以实现但是想这个查询的结果写到一个
DECLARE @Table TABLE里面就整不出了




...全文
1575 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
幸运的意外 2011-02-15
  • 打赏
  • 举报
回复
还是用group by 结合动态SQL来进行处理吧。米有必要用over()
Linares 2011-02-15
  • 打赏
  • 举报
回复
那是你看花眼了
除非select还有其它字段
ccshigenvwa 2011-02-15
  • 打赏
  • 举报
回复
上面帖子引用错了,应该引用二楼朋友说的方法,我开始就是这样的但是查询结果不对
ccshigenvwa 2011-02-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 cancan830 的回复:]
SQL code

现有数据,利用分组统计各个地区或各个乡镇的人数
ID a b stu
1 地区1 乡镇11 学生1
2 地区2 乡镇21 学生2
3 地区1 乡镇12 学生3
4 地区2 乡镇22 学生4
5 地区1 乡镇13 学生5
6 ……
[/Quote]
查询结果好像不对哦,
还有回楼上的,不是我懒哦,主要是同一个表分组方式多大10个,如果用if判断是可以写但是太多啦,还不是想简化下嘛
Linares 2011-02-15
  • 打赏
  • 举报
回复
对于参数问题,没几个字段,if枚举一下不会死人,别老想着什么动态。
Linares 2011-02-15
  • 打赏
  • 举报
回复
这属于滥用 over() 开窗

明明 group by 就可以实现,非要弄个over()/distinct,显摆么?

select a, count(stu) from TempDBa group by a
王向飞 2011-02-15
  • 打赏
  • 举报
回复

--> 数据库版本:
--> Microsoft SQL Server 2008 (RTM) - 10.0.1600.22
--> 测试数据:TempDBa
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'TempDBa')
AND type in (N'U')) --U 代表你查询的是表
DROP TABLE TempDBa
GO

---->建表
create table TempDBa([ID] int,[a] varchar(5),[b] varchar(6),[STU] varchar(6))
insert TempDBa
select 1,'地区1','乡镇11','学生1' union all
select 2,'地区2','乡镇21','学生2' union all
select 3,'地区1','乡镇12','学生3' union all
select 4,'地区2','乡镇22','学生4' union all
select 5,'地区1','乡镇13','学生5' union all
select 6,'地区2','乡镇21','学生6' union all
select 7,'地区1','乡镇11','学生7' union all
select 8,'地区2','乡镇23','学生8' union all
select 9,'地区1','乡镇12','学生9' union all
select 10,'地区2','乡镇22','学生10'
GO



--> 查询结果
DECLARE @Table TABLE([ID] varchar(100) ,TotalMan int)
DECLARE @v varchar(100)
set @v='a' --就是在这里获取不同的值,查询的结果分组也不同
insert into @Table
SELECT DISTINCT @v,COUNT(STU) OVER(PARTITION BY @v) AS TotalMan FROM TempDBa

select * from @Table
--> 删除表格
--DROP TABLE TempDBa

22,207

社区成员

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

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