麻烦大家帮提个SQL查询思路

zhlym 2009-07-25 11:16:23
某表记录如下
idyear yearmony num0 num1 num2 num3 num4 num5 num6
2 10 0 10 10 10 8 19 30
5 26 0 0 0 0 26 13 21
1 7 0 7 19 13 12 13 11

关系说明:idyear的数据值对应关系为表示从num0开始起第n个字段填入yearmony的数值(如第一行idyear为2,那么在num0开始起第二列即num1值为10),num1之后的值就是无序的了,依次类推

结果要求:需要查询结果就是要把每行全部num0起的字段作sum()累加计算,但要把每一行num0(包括num0)起最靠左的值当等于当前行yearmony值时要使其numx(当前列)的值变回为0加入sum()中计算

麻烦大家提供个思路,3Q
...全文
100 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhlym 2009-07-25
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 jamin_liu 的回复:]
declare @sql nvarchar(max)=''
select @sql+='sum(case when idyear='+cast(idyear as varchar) +' then 0 else num'+cast(idyear as varchar)+' end'+') as num'+cast(idyear as varchar)+','
from tablename
group by idyear


set @sql='select '+left(@sql,len(@sql)-1) +' from tablename'
exec sp_executeSQL @sql
[/Quote]

你这个语句调的通吗?SQL2000试发现不行
Jamin_Liu 2009-07-25
  • 打赏
  • 举报
回复
declare @sql nvarchar(max)=''
select @sql+='sum(case when idyear='+cast(idyear as varchar) +' then 0 else num'+cast(idyear as varchar)+' end'+') as num'+cast(idyear as varchar)+','
from tablename
group by idyear


set @sql='select '+left(@sql,len(@sql)-1) +' from tablename'
exec sp_executeSQL @sql
zhlym 2009-07-25
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 guguda2008 的回复:]
那就用不逆的列转行再转列就行了
[/Quote]

这个还真不知怎弄了,还望整个例子,3Q
guguda2008 2009-07-25
  • 打赏
  • 举报
回复
那就用不逆的列转行再转列就行了
zhlym 2009-07-25
  • 打赏
  • 举报
回复
guguda2008

CASE WHEN IDYEAR =6 THEN 0 ELSE NUM6 END
这是我也用的一种方法,但因为我的要计算的字段有70列之多呀,这样是不是有点。。。,所以想求高效一点的做法
guguda2008 2009-07-25
  • 打赏
  • 举报
回复

--哪有那么麻烦
DECLARE @T TABLE(
idyear INT,
YEARMONEY INT,
NUM0 INT,
NUM1 INT,
NUM2 INT,
NUM3 INT,
NUM4 INT,
NUM5 INT,
NUM6 INT
)
INSERT INTO @T
SELECT 2, 10, 0, 0, 10, 10, 8, 19, 30 UNION ALL
SELECT 5, 26, 0, 0, 0, 0, 0 , 26, 21 UNION ALL
SELECT 1, 7, 0, 7, 19, 13, 12, 13, 11

SELECT
SUM(CASE WHEN IDYEAR =0 THEN 0 ELSE NUM0 END)
,SUM(CASE WHEN IDYEAR =1 THEN 0 ELSE NUM1 END)
,SUM(CASE WHEN IDYEAR =2 THEN 0 ELSE NUM2 END)
,SUM(CASE WHEN IDYEAR =3 THEN 0 ELSE NUM3 END)
,SUM(CASE WHEN IDYEAR =4 THEN 0 ELSE NUM4 END)
,SUM(CASE WHEN IDYEAR =5 THEN 0 ELSE NUM5 END)
,SUM(CASE WHEN IDYEAR =6 THEN 0 ELSE NUM6 END)
FROM @T

/*
0 0 19 23 20 32 62
*/

zhlym 2009-07-25
  • 打赏
  • 举报
回复
jiangshun你的语句不是我想要的结果

不好意思,首先表记录更正
某表记录如下
idyear yearmony num0 num1 num2 num3 num4 num5 num6
2 10 0 0 10 10 8 19 30
5 26 0 0 0 0 0 26 21
1 7 0 7 19 13 12 13 11

关系说明:idyear的数据值对应关系为表示从num0开始起第n个字段填入yearmony的数值(如第一行idyear为2,那么在num0开始起第二列即num2值为10),num2之后的值就是无序的了,依次类推

结果要求:需要查询结果就是要把每行全部num0起的字段作sum()累加计算,但要把每一行num0(包括num0)起最靠左的值当等于当前行yearmony值时要使其num?(?为当前列数字段)的值变回为0加入sum()中计算

作了sum()要的结果如下

num0 num1 num2 num3 num4 num5 num6
0 0 19 23 20 32 62

麻烦再提供一下思路
jiangshun 2009-07-25
  • 打赏
  • 举报
回复

-----------------------------------------

--> 测试时间:2009-07-25
--> 我的淘宝:http://shop36766744.taobao.com/

--------------------------------------------------

if object_id('[TB]') is not null drop table [TB]
create table [TB]([idyear] int,[yearmony] int,[num0] int,[num1] int,[num2] int,[num3] int,[num4] int,[num5] int,[num6] int)
insert [TB]
select 2,10,0,10,10,10,8,19,30 union all
select 5,26,0,0,0,0,26,13,21 union all
select 1,7,0,7,19,13,12,13,11

select * from [TB]


declare @s nvarchar(4000)
select @s=isnull(@s+' union all ','')+'select idyear=idyear'+',[num]='
+quotename(Name)+' from TB'
from syscolumns where ID=object_id('TB') and Name not in('idyear','yearmony')
order by Colid
exec('select idyear,总和=sum(num) from ('+@s+')t group by idyear order by [idyear]')--

/*
idyear 总和
----------- -----------
1 75
2 87
5 60
*/

drop table TB
claro 2009-07-25
  • 打赏
  • 举报
回复
帮顶
zhlym 2009-07-25
  • 打赏
  • 举报
回复
不好意思,首先表记录更正
某表记录如下
idyear yearmony num0 num1 num2 num3 num4 num5 num6
2 10 0 0 10 10 8 19 30
5 26 0 0 0 0 0 26 21
1 7 0 7 19 13 12 13 11

关系说明:idyear的数据值对应关系为表示从num0开始起第n个字段填入yearmony的数值(如第一行idyear为2,那么在num0开始起第二列即num1值为10),num1之后的值就是无序的了,依次类推

结果要求:需要查询结果就是要把每行全部num0起的字段作sum()累加计算,但要把每一行num0(包括num0)起最靠左的值当等于当前行yearmony值时要使其numx(当前列)的值变回为0加入sum()中计算

作了sum()要的结果如下

num0 num1 num2 num3 num4 num5 num6
0 0 19 23 20 32 62

jiangshun 2009-07-25
  • 打赏
  • 举报
回复
不是很明白楼主的意思,具体得到什么结果?
zhlym 2009-07-25
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 jamin_liu 的回复:]
引用 11 楼 zhlym 的回复:
引用 10 楼 jamin_liu 的回复:
declare @sql nvarchar(max)=''
select @sql+='sum(case when idyear='+cast(idyear as varchar) +' then 0 else num'+cast(idyear as varchar)+' end'+') as num'+cast(idyear as varchar)+','
from tablename
group by idyear


set @sql='select '+left(@sql,len(@sql)-1) +' from tablename'
exec sp_executeSQL @sql


你这个语句调的通吗?SQL2000试发现不行

SQL2000好象不支持@sql+=這種寫法,你改成@SQL=@SQL+不就行了嗎
[/Quote]

关健是结果不对
Jamin_Liu 2009-07-25
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zhlym 的回复:]
引用 10 楼 jamin_liu 的回复:
declare @sql nvarchar(max)=''
select @sql+='sum(case when idyear='+cast(idyear as varchar) +' then 0 else num'+cast(idyear as varchar)+' end'+') as num'+cast(idyear as varchar)+','
from tablename
group by idyear


set @sql='select '+left(@sql,len(@sql)-1) +' from tablename'
exec sp_executeSQL @sql


你这个语句调的通吗?SQL2000试发现不行
[/Quote]
SQL2000好象不支持@sql+=這種寫法,你改成@SQL=@SQL+不就行了嗎

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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