专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > Sql Server

请问一个查询SQL语句

发布时间:2010-05-20 14:01:29 文章来源:www.iduyao.cn 采编人员:星星草
请教一个查询SQL语句
有一个表A,字段如下
id   s1     s2    tp
1     10    15      1
2      54    23     1
3      23   45      2

现在想按照tp来分类汇总S1和S2,而且要在同一行
例如查询后结果应该是这样的
相当于以tp为条件,分别sum(s1),sum(s2),然后显示到同一行上
ts1 ts2 ys1 ys2
64  38  23  25
------解决思路----------------------
只有两行变成一行,可以这么写。

;with tbl1(id,s1,s2,tp) as
(
  select 1,10,15,1 union all
  select 2,54,23,1 union all
  select 3,23,45,2
 ),
 tbl2 as
 (
   select tp, sum(s1) as s1,sum(s2) as s2 
   from tbl1
   group by tp
),
tbl3 as
(
  select 
    ROW_NUMBER() OVER(order by tp) as nid, 
    s1, s2 
  from tbl2
)
select top 1 
  t1.s1 as ts1, t1.s2 as ts2, 
  t2.s1 as ys1, t2.s2 as ys2  
from tbl3 as t1 
left join tbl3 as t2
on t1.nid = t2.nid -1

------解决思路----------------------
静态行转列:

;with tbl1(id,s1,s2,tp) as
(
  select 1,10,15,1 union all
  select 2,54,23,1 union all
  select 3,23,45,2
 ),
 tbl2 as
 (
   select tp, sum(s1) as s1,sum(s2) as s2 
   from tbl1
   group by tp
),
tbl3 as
(
  select 
    ROW_NUMBER() OVER(order by tp) as nid, 
    s1, s2, 1 as id 
  from tbl2
)

select 
  t1.[1] as ts1, t2.[1] as ts2,  
  t1.[2] as ys1, t2.[2] as ys1
from 
(
select id, [1],[2]
from (select id, nid, s1 from tbl3) as t1
pivot
  (
     avg(s1) for nid in([1],[2])
  ) as T
) as t1
inner join 
(
select id, [1],[2]
from (select id, nid, s2 from tbl3) as t1
pivot
  (
     avg(s2) for nid in([1],[2])
  ) as T
)as t2
on t1.id = t2.id



ts1 ts2 ys1 ys1
64 38 23 45
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: