select B.AREA_NAME,dbo.getChildAreaNum(B.AREA_NAME) as subareaCount,
sum(gj_hdcs) as gj_hdcs ,sum(gj_cjrc) as gj_cjrc ,
sum(bmfw_hdcs) as bmfw_hdcs ,sum(bmfw_cjrc) as bmfw_cjrc ,
sum(hotline_hdcs) as hotline_hdcs ,sum(hotline_cjrc) as hotline_cjrc ,
sum(zyz_hdcs) as zyz_hdcs ,sum(zyz_cjrc) as zyz_cjrc ,
sum(zh_hdcs) as zh_hdcs ,sum(zh_cjrc) as zh_cjrc
from (
select regionid,count(*) as gj_hdcs,0 as gj_cjrc,0 as bmfw_hdcs, 0 as bmfw_cjrc, 0 as hotline_hdcs , 0 as hotline_cjrc , 0 as zyz_hdcs , 0 as zyz_cjrc , 0 as zh_hdcs , 0 as zh_cjrc
from view_center_item where type=2 and regionid>0
group by regionid
UNION ALL
select regionid,0 as gj_hdcs,sum(activities_num) as gj_cjrc,0 as bmfw_hdcs, 0 as bmfw_cjrc, 0 as hotline_hdcs , 0 as hotline_cjrc , 0 as zyz_hdcs , 0 as zyz_cjrc , 0 as zh_hdcs , 0 as zh_cjrc
from view_center_item where type=2 and regionid>0
group by regionid
UNION ALL select regionid,0 as gj_hdcs,0 as gj_cjrc,count(*) as bmfw_hdcs, 0 as bmfw_cjrc, 0 as hotline_hdcs , 0 as hotline_cjrc , 0 as zyz_hdcs , 0 as zyz_cjrc , 0 as zh_hdcs , 0 as zh_cjrc
from view_center_item where type=2 and activities_type=400 and regionid>0
group by regionid
UNION ALL select regionid,0 as gj_hdcs,0 as gj_cjrc,0 as bmfw_hdcs, sum(activities_num) as bmfw_cjrc, 0 as hotline_hdcs , 0 as hotline_cjrc , 0 as zyz_hdcs , 0 as zyz_cjrc , 0 as zh_hdcs , 0 as zh_cjrc
from view_center_item where type=2 and activities_type=400 and regionid>0
group by regionid
UNION ALL select regionid,0 as gj_hdcs,0 as gj_cjrc,0 as bmfw_hdcs, 0 as bmfw_cjrc, count(*) as hotline_hdcs , 0 as hotline_cjrc , 0 as zyz_hdcs , 0 as zyz_cjrc , 0 as zh_hdcs , 0 as zh_cjrc
from view_center_item where type=2 and activities_type=401 and regionid>0
group by regionid
UNION ALL select regionid,0 as gj_hdcs,0 as gj_cjrc,0 as bmfw_hdcs, 0 as bmfw_cjrc, 0 as hotline_hdcs , sum(activities_num) as hotline_cjrc , 0 as zyz_hdcs , 0 as zyz_cjrc , 0 as zh_hdcs , 0 as zh_cjrc
from view_center_item where type=2 and activities_type=401 and regionid>0
group by regionid
UNION ALL select regionid,0 as gj_hdcs,0 as gj_cjrc,0 as bmfw_hdcs, 0 as bmfw_cjrc, 0 as hotline_hdcs , 0 as hotline_cjrc , count(*) as zyz_hdcs , 0 as zyz_cjrc , 0 as zh_hdcs , 0 as zh_cjrc
from view_center_item where type=2 and activities_type=402 and regionid>0
group by regionid
UNION ALL select regionid,0 as gj_hdcs,0 as gj_cjrc,0 as bmfw_hdcs, 0 as bmfw_cjrc, 0 as hotline_hdcs , 0 as hotline_cjrc , 0 as zyz_hdcs , sum(activities_num) as zyz_cjrc , 0 as zh_hdcs , 0 as zh_cjrc
from view_center_item where type=2 and activities_type=402 and regionid>0
group by regionid
UNION ALL select regionid,0 as gj_hdcs,0 as gj_cjrc,0 as bmfw_hdcs, 0 as bmfw_cjrc, 0 as hotline_hdcs , 0 as hotline_cjrc , 0 as zyz_hdcs , 0 as zyz_cjrc , count(*) as zh_hdcs , 0 as zh_cjrc
from view_center_item where type=2 and activities_type=403 and regionid>0
group by regionid
UNION ALL select regionid,0 as gj_hdcs,0 as gj_cjrc,0 as bmfw_hdcs, 0 as bmfw_cjrc, 0 as hotline_hdcs , 0 as hotline_cjrc , 0 as zyz_hdcs , 0 as zyz_cjrc , 0 as zh_hdcs , sum(activities_num) as zh_cjrc
from view_center_item where type=2 and activities_type=403 and regionid>0
group by regionid
) a
INNER JOIN SYS_AREA B
ON A.regionid = B.ID
GROUP BY B.AREA_NAME
一个同事做报表的时候写的SQL,太复杂了,那么多UNION ALL, 大乌龟能不能合并下,想合并,但是找不到具体办法实现合并啊!
26 个解决方案
#1
等待大乌龟的到来!
#2
等待大乌龟的到来!
#3
同一个表多个union all
可以考虑改成sum(cas when ...)
可以考虑改成sum(cas when ...)
#4
这么多的关联呀,表结构可能还需要优化呢
#5
报表不一定都用SQL去实现的把,结果查出来,报表里面设计排序分组都可以的,比如水晶报表,
像你上面这情况,要得到这样结果可能要很多次UNION了,所以应该考虑表结构了,奖结果放到一张被用表里面
像你上面这情况,要得到这样结果可能要很多次UNION了,所以应该考虑表结构了,奖结果放到一张被用表里面
#6
就是个行列转换吧?
/*
标题:普通行列转换(version 2.0)
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-03-09
地点:广东深圳
说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。
问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果):
姓名 语文 数学 物理
---- ---- ---- ----
李四 74 84 94
张三 74 83 93
-------------------
*/
create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
go
--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
select 姓名 as 姓名 ,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理
from tb
group by 姓名
--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql)
--SQL SERVER 2005 静态SQL。
select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b
--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
set @sql = '[' + @sql + ']'
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')
---------------------------------
/*
问题:在上述结果的基础上加平均分,总分,得到如下结果:
姓名 语文 数学 物理 平均分 总分
---- ---- ---- ---- ------ ----
李四 74 84 94 84.00 252
张三 74 83 93 83.33 250
*/
--SQL SERVER 2000 静态SQL。
select 姓名 姓名,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理,
cast(avg(分数*1.0) as decimal(18,2)) 平均分,
sum(分数) 总分
from tb
group by 姓名
--SQL SERVER 2000 动态SQL。
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名'
exec(@sql)
--SQL SERVER 2005 静态SQL。
select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b) m,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名
--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
exec ('select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b) m ,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名')
drop table tb
------------------
------------------
/*
问题:如果上述两表互相换一下:即表结构和数据为:
姓名 语文 数学 物理
张三 74 83 93
李四 74 84 94
想变成(得到如下结果):
姓名 课程 分数
---- ---- ----
李四 语文 74
李四 数学 84
李四 物理 94
张三 语文 74
张三 数学 83
张三 物理 93
--------------
*/
create table tb(姓名 varchar(10) , 语文 int , 数学 int , 物理 int)
insert into tb values('张三',74,83,93)
insert into tb values('李四',74,84,94)
go
--SQL SERVER 2000 静态SQL。
select * from
(
select 姓名 , 课程 = '语文' , 分数 = 语文 from tb
union all
select 姓名 , 课程 = '数学' , 分数 = 数学 from tb
union all
select 姓名 , 课程 = '物理' , 分数 = 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 end
--SQL SERVER 2000 动态SQL。
--调用系统表动态生态。
declare @sql varchar(8000)
select @sql = isnull(@sql + ' union all ' , '' ) + ' select 姓名 , [课程] = ' + quotename(Name , '''') + ' , [分数] = ' + quotename(Name) + ' from tb'
from syscolumns
where name! = N'姓名' and ID = object_id('tb') --表名tb,不包含列名为姓名的其它列
order by colid asc
exec(@sql + ' order by 姓名 ')
--SQL SERVER 2005 动态SQL。
select 姓名 , 课程 , 分数 from tb unpivot (分数 for 课程 in([语文] , [数学] , [物理])) t
--SQL SERVER 2005 动态SQL,同SQL SERVER 2000 动态SQL。
--------------------
/*
问题:在上述的结果上加个平均分,总分,得到如下结果:
姓名 课程 分数
---- ------ ------
李四 语文 74.00
李四 数学 84.00
李四 物理 94.00
李四 平均分 84.00
李四 总分 252.00
张三 语文 74.00
张三 数学 83.00
张三 物理 93.00
张三 平均分 83.33
张三 总分 250.00
------------------
*/
select * from
(
select 姓名 as 姓名 , 课程 = '语文' , 分数 = 语文 from tb
union all
select 姓名 as 姓名 , 课程 = '数学' , 分数 = 数学 from tb
union all
select 姓名 as 姓名 , 课程 = '物理' , 分数 = 物理 from tb
union all
select 姓名 as 姓名 , 课程 = '平均分' , 分数 = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb
union all
select 姓名 as 姓名 , 课程 = '总分' , 分数 = 语文 + 数学 + 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 end
drop table tb
#7
select B.AREA_NAME,
dbo.getChildAreaNum(B.AREA_NAME) as subareaCount,
sum(1) as gj_hdcs ,
sum(a.activities_num) as gj_cjrc ,
sum(case when a.activities_type=400 then 1 else 0 end) as bmfw_hdcs ,
sum(case when a.activities_type=400 then a.activities_num else 0 end) as bmfw_cjrc ,
sum(case when a.activities_type=401 then 1 else 0 end) as hotline_hdcs ,
sum(case when a.activities_type=401 then a.activities_num else 0 end) as hotline_cjrc ,
sum(case when a.activities_type=402 then 1 else 0 end) as zyz_hdcs ,
sum(case when a.activities_type=402 then a.activities_num else 0 end) as zyz_cjrc ,
sum(case when a.activities_type=403 then 1 else 0 end) as zh_hdcs ,
sum(case when a.activities_type=403 then a.activities_num else 0 end) as zh_cjrc
from view_center_item a
INNER JOIN SYS_AREA B
ON A.regionid = B.ID
where a.type=2 and regionid>0
GROUP BY B.AREA_NAME
#8
union all造成一个视图多次查询,性能当然受影响了
#9
正解!
大乌龟,是行列转换?你是怎么看出来的?如何看的?
#10
view
#11
从哪里看出是行列转换的?大乌龟?
#12
..
#13
没有看出来是行专列,大乌龟是厉害,兄弟还需努力
#14
我看你这么多按照不同的条件合并成一个表,然后求合计?
如果你只是这些需求,没有详细的说明,很难帮助你,帮顶.
如果你只是这些需求,没有详细的说明,很难帮助你,帮顶.
#15
关注
#16
狂顶这个做法,我一般都喜欢这么写,一句搞定。
#17
如何搞定呢?
#18
select
B.AREA_NAME,dbo.getChildAreaNum(B.AREA_NAME) as subareaCount,
[gj_hdcs]=count(*),[gj_cjrc]=sum(activities_num),
[bmfw_hdcs]=sum(case a.activities_type when 400 then 1 else 0 end),
[bmfw_cjrc]=sum(case a.activities_type when 400 then activities_num else 0 end),
[hotline_hdcs]=sum(case a.activities_type when 401 then 1 else 0 end),
[hotline_cjrc]=sum(case a.activities_type when 401 then activities_num else 0 end),
[zyz_hdcs]=sum(case a.activities_type when 402 then 1 else 0 end),
[zyz_cjrc]=sum(case a.activities_type when 402 then activities_num else 0 end),
[zh_hdcs]=sum(case a.activities_type when 403 then 1 else 0 end),
[zh_cjrc]=sum(case a.activities_type when 403 then activities_num else 0 end)
from view_center_item a
inner join SYS_AREA b on a.regionid=b.ID
where type=2 and regionid>0 and a.activities_type between 400 and 403
group by B.AREA_NAME
#19
用case when 處理
#20
select
B.AREA_NAME,dbo.getChildAreaNum(B.AREA_NAME) as subareaCount,
[gj_hdcs]=count(*),[gj_cjrc]=sum(activities_num),
[bmfw_hdcs]=sum(case a.activities_type when 400 then 1 else 0 end),
[bmfw_cjrc]=sum(case a.activities_type when 400 then activities_num else 0 end),
[hotline_hdcs]=sum(case a.activities_type when 401 then 1 else 0 end),
[hotline_cjrc]=sum(case a.activities_type when 401 then activities_num else 0 end),
[zyz_hdcs]=sum(case a.activities_type when 402 then 1 else 0 end),
[zyz_cjrc]=sum(case a.activities_type when 402 then activities_num else 0 end),
[zh_hdcs]=sum(case a.activities_type when 403 then 1 else 0 end),
[zh_cjrc]=sum(case a.activities_type when 403 then activities_num else 0 end)
from view_center_item a
inner join SYS_AREA b on a.regionid=b.ID
where type=2 and regionid>0 and a.activities_type between 400 and 403
group by B.AREA_NAME
#21
帮顶
#22
7楼早写了,楼主似乎没测试
#23
你的速度 是受
getChildAreaNum 函数影响的
还有 那么多的 UNION ALL 可以不用。 直接 一条查询出 COUNT SUM 等要查的数据。 那么多的UNION ALL 其实是每个字段查了一次,可以在一个查询查出所有该统计的字段。
getChildAreaNum 函数影响的
还有 那么多的 UNION ALL 可以不用。 直接 一条查询出 COUNT SUM 等要查的数据。 那么多的UNION ALL 其实是每个字段查了一次,可以在一个查询查出所有该统计的字段。
#24
大乌龟说的不错,同是一张表,而且里面条件UNION ALL语句的又是列出了所有activities_type的值。估计除了group by regionid 之外还可以group by activities_type 的吧!
这么一算,就是行列转换了吧!
#25
谢谢!
#26
谢谢!
#1
等待大乌龟的到来!
#2
等待大乌龟的到来!
#3
同一个表多个union all
可以考虑改成sum(cas when ...)
可以考虑改成sum(cas when ...)
#4
这么多的关联呀,表结构可能还需要优化呢
#5
报表不一定都用SQL去实现的把,结果查出来,报表里面设计排序分组都可以的,比如水晶报表,
像你上面这情况,要得到这样结果可能要很多次UNION了,所以应该考虑表结构了,奖结果放到一张被用表里面
像你上面这情况,要得到这样结果可能要很多次UNION了,所以应该考虑表结构了,奖结果放到一张被用表里面
#6
就是个行列转换吧?
/*
标题:普通行列转换(version 2.0)
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-03-09
地点:广东深圳
说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。
问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果):
姓名 语文 数学 物理
---- ---- ---- ----
李四 74 84 94
张三 74 83 93
-------------------
*/
create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
go
--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
select 姓名 as 姓名 ,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理
from tb
group by 姓名
--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql)
--SQL SERVER 2005 静态SQL。
select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b
--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
set @sql = '[' + @sql + ']'
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')
---------------------------------
/*
问题:在上述结果的基础上加平均分,总分,得到如下结果:
姓名 语文 数学 物理 平均分 总分
---- ---- ---- ---- ------ ----
李四 74 84 94 84.00 252
张三 74 83 93 83.33 250
*/
--SQL SERVER 2000 静态SQL。
select 姓名 姓名,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理,
cast(avg(分数*1.0) as decimal(18,2)) 平均分,
sum(分数) 总分
from tb
group by 姓名
--SQL SERVER 2000 动态SQL。
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名'
exec(@sql)
--SQL SERVER 2005 静态SQL。
select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b) m,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名
--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
exec ('select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b) m ,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名')
drop table tb
------------------
------------------
/*
问题:如果上述两表互相换一下:即表结构和数据为:
姓名 语文 数学 物理
张三 74 83 93
李四 74 84 94
想变成(得到如下结果):
姓名 课程 分数
---- ---- ----
李四 语文 74
李四 数学 84
李四 物理 94
张三 语文 74
张三 数学 83
张三 物理 93
--------------
*/
create table tb(姓名 varchar(10) , 语文 int , 数学 int , 物理 int)
insert into tb values('张三',74,83,93)
insert into tb values('李四',74,84,94)
go
--SQL SERVER 2000 静态SQL。
select * from
(
select 姓名 , 课程 = '语文' , 分数 = 语文 from tb
union all
select 姓名 , 课程 = '数学' , 分数 = 数学 from tb
union all
select 姓名 , 课程 = '物理' , 分数 = 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 end
--SQL SERVER 2000 动态SQL。
--调用系统表动态生态。
declare @sql varchar(8000)
select @sql = isnull(@sql + ' union all ' , '' ) + ' select 姓名 , [课程] = ' + quotename(Name , '''') + ' , [分数] = ' + quotename(Name) + ' from tb'
from syscolumns
where name! = N'姓名' and ID = object_id('tb') --表名tb,不包含列名为姓名的其它列
order by colid asc
exec(@sql + ' order by 姓名 ')
--SQL SERVER 2005 动态SQL。
select 姓名 , 课程 , 分数 from tb unpivot (分数 for 课程 in([语文] , [数学] , [物理])) t
--SQL SERVER 2005 动态SQL,同SQL SERVER 2000 动态SQL。
--------------------
/*
问题:在上述的结果上加个平均分,总分,得到如下结果:
姓名 课程 分数
---- ------ ------
李四 语文 74.00
李四 数学 84.00
李四 物理 94.00
李四 平均分 84.00
李四 总分 252.00
张三 语文 74.00
张三 数学 83.00
张三 物理 93.00
张三 平均分 83.33
张三 总分 250.00
------------------
*/
select * from
(
select 姓名 as 姓名 , 课程 = '语文' , 分数 = 语文 from tb
union all
select 姓名 as 姓名 , 课程 = '数学' , 分数 = 数学 from tb
union all
select 姓名 as 姓名 , 课程 = '物理' , 分数 = 物理 from tb
union all
select 姓名 as 姓名 , 课程 = '平均分' , 分数 = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb
union all
select 姓名 as 姓名 , 课程 = '总分' , 分数 = 语文 + 数学 + 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 end
drop table tb
#7
select B.AREA_NAME,
dbo.getChildAreaNum(B.AREA_NAME) as subareaCount,
sum(1) as gj_hdcs ,
sum(a.activities_num) as gj_cjrc ,
sum(case when a.activities_type=400 then 1 else 0 end) as bmfw_hdcs ,
sum(case when a.activities_type=400 then a.activities_num else 0 end) as bmfw_cjrc ,
sum(case when a.activities_type=401 then 1 else 0 end) as hotline_hdcs ,
sum(case when a.activities_type=401 then a.activities_num else 0 end) as hotline_cjrc ,
sum(case when a.activities_type=402 then 1 else 0 end) as zyz_hdcs ,
sum(case when a.activities_type=402 then a.activities_num else 0 end) as zyz_cjrc ,
sum(case when a.activities_type=403 then 1 else 0 end) as zh_hdcs ,
sum(case when a.activities_type=403 then a.activities_num else 0 end) as zh_cjrc
from view_center_item a
INNER JOIN SYS_AREA B
ON A.regionid = B.ID
where a.type=2 and regionid>0
GROUP BY B.AREA_NAME
#8
union all造成一个视图多次查询,性能当然受影响了
#9
正解!
大乌龟,是行列转换?你是怎么看出来的?如何看的?
#10
view
#11
从哪里看出是行列转换的?大乌龟?
#12
..
#13
没有看出来是行专列,大乌龟是厉害,兄弟还需努力
#14
我看你这么多按照不同的条件合并成一个表,然后求合计?
如果你只是这些需求,没有详细的说明,很难帮助你,帮顶.
如果你只是这些需求,没有详细的说明,很难帮助你,帮顶.
#15
关注
#16
狂顶这个做法,我一般都喜欢这么写,一句搞定。
#17
如何搞定呢?
#18
select
B.AREA_NAME,dbo.getChildAreaNum(B.AREA_NAME) as subareaCount,
[gj_hdcs]=count(*),[gj_cjrc]=sum(activities_num),
[bmfw_hdcs]=sum(case a.activities_type when 400 then 1 else 0 end),
[bmfw_cjrc]=sum(case a.activities_type when 400 then activities_num else 0 end),
[hotline_hdcs]=sum(case a.activities_type when 401 then 1 else 0 end),
[hotline_cjrc]=sum(case a.activities_type when 401 then activities_num else 0 end),
[zyz_hdcs]=sum(case a.activities_type when 402 then 1 else 0 end),
[zyz_cjrc]=sum(case a.activities_type when 402 then activities_num else 0 end),
[zh_hdcs]=sum(case a.activities_type when 403 then 1 else 0 end),
[zh_cjrc]=sum(case a.activities_type when 403 then activities_num else 0 end)
from view_center_item a
inner join SYS_AREA b on a.regionid=b.ID
where type=2 and regionid>0 and a.activities_type between 400 and 403
group by B.AREA_NAME
#19
用case when 處理
#20
select
B.AREA_NAME,dbo.getChildAreaNum(B.AREA_NAME) as subareaCount,
[gj_hdcs]=count(*),[gj_cjrc]=sum(activities_num),
[bmfw_hdcs]=sum(case a.activities_type when 400 then 1 else 0 end),
[bmfw_cjrc]=sum(case a.activities_type when 400 then activities_num else 0 end),
[hotline_hdcs]=sum(case a.activities_type when 401 then 1 else 0 end),
[hotline_cjrc]=sum(case a.activities_type when 401 then activities_num else 0 end),
[zyz_hdcs]=sum(case a.activities_type when 402 then 1 else 0 end),
[zyz_cjrc]=sum(case a.activities_type when 402 then activities_num else 0 end),
[zh_hdcs]=sum(case a.activities_type when 403 then 1 else 0 end),
[zh_cjrc]=sum(case a.activities_type when 403 then activities_num else 0 end)
from view_center_item a
inner join SYS_AREA b on a.regionid=b.ID
where type=2 and regionid>0 and a.activities_type between 400 and 403
group by B.AREA_NAME
#21
帮顶
#22
7楼早写了,楼主似乎没测试
#23
你的速度 是受
getChildAreaNum 函数影响的
还有 那么多的 UNION ALL 可以不用。 直接 一条查询出 COUNT SUM 等要查的数据。 那么多的UNION ALL 其实是每个字段查了一次,可以在一个查询查出所有该统计的字段。
getChildAreaNum 函数影响的
还有 那么多的 UNION ALL 可以不用。 直接 一条查询出 COUNT SUM 等要查的数据。 那么多的UNION ALL 其实是每个字段查了一次,可以在一个查询查出所有该统计的字段。
#24
大乌龟说的不错,同是一张表,而且里面条件UNION ALL语句的又是列出了所有activities_type的值。估计除了group by regionid 之外还可以group by activities_type 的吧!
这么一算,就是行列转换了吧!
#25
谢谢!
#26
谢谢!