一张收款表,SQL数据横列变竖列

来源:百度知道 编辑:UC知道 时间:2024/06/21 16:28:44
我手里有这样一张收款表table_1,字段有cstname(客户姓名),ysamonut(应收款),ysdate(应收日期),ssdate(实收日期),ysitemname(应收款项名称,主要有定金,首期,楼款)。我通过这张表构建了这么一张表table_2,字段有cstname,ysamount,ysitemname,ysdate,ssdate,amount(滞纳金),date(违约日),其中date是DATEDIFF(day,ysdate,ssdate);amount是这样的当DATEDIFF(day,ysdate,ssdate)>0 and DATEDIFF(day,ysdate,ssdate)<=30 then ysamount*0.005*DATEDIFF(day,ysdate,ssdate) ;或者当 DATEDIFF(day,ysdate,ssdate)>30 then ysamount*0.007*DATEDIFF(day,ysdate,ssdate)
因为有些客人交款情况是这样的:比如张三应缴款(首期30万),客人在违约后30天内,分三次分别交款(一次10天5万,一次15天10万,最后一次35天15万),所以就出现了这样的情况
cstname, ysamount, ysitemname,ysdate,ssdate,amount,date
张三, 30万, 首期, 9.1 ,9.5 XXX, 5
张三, 30万, 首期, 9.1 ,9.15 XXX, 15
张三, 30万, 首期, 9.1 ,10.5 XXX, 35
张三, 50万, 楼款, 10.1 ,10.5 XXX, 5
我想把这个表变成
张三,30万,总首期滞纳金,总楼款滞纳金,...这样的
李四,...
1楼朋友,我这个问题和你那个的不一样,你是同一个人但是一个课程就一条数据,但是我这个是客人会把一笔款项分多次交,所以有多条数据,好比你的王蓝琏有两条英语成绩的情况,你怎么合并成一条,英语总成绩

可以先

select 一下 插入临时表 做个汇总
例如:
select sum(要汇总的字段) as 字段名 into #临时表 from 表名

然后再 按 行转列的方法 转换

http://blog.sina.com.cn/s/blog_4cca663f0100abfv.html
这里有 很详细的 方法 看看吧

group一下就行了,把成绩sum一下不就可以了。
如下,改成这样就行了。
select @sql=@sql+','+rtrim(课程)+'=(SELECT isnull(SUM(case b.课程 when '''+课程+''' then ISNULL(SUM(b.成绩),0) end ),0) FROM ddt b where b.姓名=t.姓名 group by b.姓名, b.课程)'
from ddt
group by 课程
order by 课程

给你个例子,你看看吧
有一个数据表(dtt)结构如下(课程数是不确定的,可能后面还有其他的):
姓名 课程 成绩
王蓝琏 英语 76
王蓝琏 语文 65
王蓝琏 数学 65
李星颜 英语 86
李星颜 语文 54
李星颜 数学 76
叶梦雪 英语 56
叶梦雪 语文 88
叶梦雪 数学 86
朱紫云 数学 64
朱紫云 英语 88

现在查询得出的数据表(rrt)如下:
姓名 语文 数学 英语 总计
王蓝琏 65 65 76 206
李星颜 54 76 86 216
叶梦雪 88 86 56 23