条件查询

qq5612415 2010-09-17 09:17:24
表1里面有字段date,用来保存日期, 字段M,W,F都是用来保存价钱的
表2里面有字段month,用来保存自定义的月份,bdate,开始日期,edate,结束日期

例如:
表1: date M W F
5/16/2010 10 5 20
5/17/2010 25 10 30
8/15/2010 30 20 10
1/22/2011 10 50 10

表2:
month bdate edate
P01FY11 4/4/2010 5/1/2010
P02FY11 5/2/2010 5/29/2010
P03FY11 5/30/2010 7/3/2010
P04FY11 7/4/2010 7/31/2010
P05FY11 8/1/2010 8/28/2010
P06FY11 8/29/2010 10/2/2010
P07FY11 10/3/2010 10/30/2010
P08FY11 10/31/2010 11/27/2010
P09FY11 11/28/2010 1/1/2011
P10FY11 1/2/2011 1/29/2011
P11FY11 1/30/2011 2/26/2011
P12FY11 2/27/2011 3/31/2011

这里我想说明一下,表2的P01FY11-P12FY11(1月到12月) 就代表一个财年,P01是一月份(从4/4/2010到5/1/2010),P01-P12是固定不变的,每年变的是后面的FY11,2010年是FY11,2011是FY12....每年的月份划分都是这样(今年的4月到明年的3月为一年)

现在我想用“传参的方式”(因为有几年的数据,不只是当年)查出表1中date在表2中日期范围内(也就是一年之内)的价格总数,用datagrid显示数据,请大家帮帮忙写段代码,麻烦了,谢谢!要实现下面的效果:
Month P01 P02 P03 P04 P05 P06 P07 P08 P09 P10 P11 P12 total(总价)
M
W
F
total
...全文
109 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
chazikai24 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 createtim 的回复:]

sql server 2005以后有的版本有统计函数 可以实现这种效果你可以参考一下

还可以使用游标实现。
[/Quote]
UP,学习一下行列互转
gongsun 2010-09-17
  • 打赏
  • 举报
回复

/*--行列互换的通用存储过程(原著:邹建):将指定的表,按指定的字段进行行列互换*/

create proc p_zj
@tbname sysname, --要处理的表名
@fdname sysname, --做为转换的列名
@new_fdname sysname='' --为转换后的列指定列名
as
declare @s1 varchar(8000) , @s2 varchar(8000),
@s3 varchar(8000) , @s4 varchar(8000),
@s5 varchar(8000) , @i varchar(10)
select @s1 = '' , @s2 = '' , @s3 = '' , @s4 = '' , @s5 = '' , @i = '0'
select @s1 = @s1 + ',@' + @i + ' varchar(8000)',
@s2 = @s2 + ',@' + @i + '=''' + case isnull(@new_fdname , '') when '' then ''
else @new_fdname + '=' end + '''''' + name + '''''''',
@s3 = @s3 + 'select @' + @i + '=@' + @i + '+'',['' + [' + @fdname +
']+'']=''+cast([' + name + '] as varchar) from [' + @tbname + ']',
@s4 = @s4 + ',@' + @i + '=''select ''+@' + @i,
@s5 = @s5 + '+'' union all ''+@' + @i,
@i=cast(@i as int)+1
from syscolumns
where object_id(@tbname)=id and name<>@fdname

select @s1=substring(@s1,2,8000),
@s2=substring(@s2,2,8000),
@s4=substring(@s4,2,8000),
@s5=substring(@s5,16,8000)
exec('declare ' + @s1 + 'select ' + @s2 + @s3 + 'select ' + @s4 + '
exec(' + @s5 + ')')
go

--用上面的存储过程测试:

create table Test(月份 varchar(4), 工资 int, 福利 int, 奖金 int)
insert Test
select '1月',100,200,300 union all
select '2月',110,210,310 union all
select '3月',120,220,320 union all
select '4月',130,230,330
go

exec p_zj 'Test', '月份' , '项目'

drop table Test
drop proc p_zj

/*
项目 1月 2月 3月 4月
---- ----------- ----------- ----------- -----------
福利 200 210 220 230
工资 100 110 120 130
奖金 300 310 320 330

(所影响的行数为 3 行)
*/

createTim 2010-09-17
  • 打赏
  • 举报
回复
sql server 2005以后有的版本有统计函数 可以实现这种效果你可以参考一下

还可以使用游标实现。
yoyo_ 2010-09-17
  • 打赏
  • 举报
回复
学习了!谢谢~~

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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