表字段:学生ID,学生交费标准(每年),已交学费(每年),交费年度,年级
2006001 7600 7600 2006 2006
2006001 6600 6600 2007 2006
2006002 7600 7600 2006 2006
2006002 6600 6600 2007 2006
2007001 7000 7000 2007 2007
表结构大致如此求结果:
学生ID,第一年交费标准,第一年已交费用,第二年交费标准,第二年已交费用
2006001 7600 7600 6600 6600
2006002 7600 7600 6600 6600
2007001 7000 7000
想了一天了没结果 ,求高手帮助!
2006001 7600 7600 2006 2006
2006001 6600 6600 2007 2006
2006002 7600 7600 2006 2006
2006002 6600 6600 2007 2006
2007001 7000 7000 2007 2007
表结构大致如此求结果:
学生ID,第一年交费标准,第一年已交费用,第二年交费标准,第二年已交费用
2006001 7600 7600 6600 6600
2006002 7600 7600 6600 6600
2007001 7000 7000
想了一天了没结果 ,求高手帮助!
解决方案 »
- 有左中括号([)右中括号(])的查询如何做?
- 备份还原问题
- [求助]Eclipse怎样与SqlServer 2008连接
- 很少在sql中写存储过程与函数
- 在企业管理器的SQLSERVER组里新建SQLSERVER注册失败,为什么
- 請高手指教~~~
- SqlServer 中 如何用Sql语句在一张数据表的指定位置添加字段
- 菜菜的问题,在线等待:如何更改sa的口令?
- 有请各位SQL高手,关于数据库中DBO对象的问题
- 有无对比2个表的表结构sql?
- 哪有exists使用方法以?学了很久的sqlserver ,总不不知道 exists 深入含义?请前辈指路!!
- 安装msde到最后阶段为何安装进度无任何提示的自动回滚,安装失败!
Select
学生ID,
Max(Case When 年级 = 交费年度 Then 学生交费标准 Else Null End) As 第一年交费标准,
Max(Case When 年级 = 交费年度 Then 已交学费 Else Null End) As 第一年交费标准,
Max(Case When 年级 = 交费年度 - 1 Then 学生交费标准 Else Null End) As 第二年交费标准,
Max(Case When 年级 = 交费年度 - 1 Then 已交学费 Else Null End) As 第二年已交费用,
Max(Case When 年级 = 交费年度 - 2 Then 学生交费标准 Else Null End) As 第三年交费标准,
Max(Case When 年级 = 交费年度 - 2 Then 已交学费 Else Null End) As 第三年已交费用,
Max(Case When 年级 = 交费年度 - 3 Then 学生交费标准 Else Null End) As 第四年交费标准,
Max(Case When 年级 = 交费年度 - 3 Then 已交学费 Else Null End) As 第四年已交费用
From
TEST
Group By
学生ID
SELECT @sql = 'select 学生ID '
select @sql = @sql + ',sum(case cou when '''+cou+''' then 学生交费标准(每年) else 0 end) as '''+cou
+',sum(case cou when '''+cou+''' then 已交学费(每年) else 0 end) as '''+cou +''','
from (select distinct cou from (select *,(select count(1) from 表 where 学生ID=a.学生ID and a.交费年度> 交费年度) as cou from 表 a)a) as a
select @sql = @sql + ' from (select *,(select count(1) from 表 where 学生ID=a.学生ID and a.交费年度> 交费年度) as cou from 表 a)a group by cou'
exec(@sql)差不多这样~
Create Table TEST
(学生ID Char(7),
学生交费标准 Int,
已交学费 Int,
交费年度 Int,
年级 Int)
Insert TEST Select '2006001', 7600, 7600, 2006, 2006
Union All Select '2006001', 6600, 6600, 2007, 2006
Union All Select '2006002', 7600, 7600, 2006, 2006
Union All Select '2006002', 6600, 6600, 2007, 2006
Union All Select '2007001', 7000, 7000, 2007, 2007
GO
--測試
--一般是不會超過4年的,就可以采用固定的寫法
Select
学生ID,
Max(Case When 年级 = 交费年度 Then 学生交费标准 Else Null End) As 第一年交费标准,
Max(Case When 年级 = 交费年度 Then 已交学费 Else Null End) As 第一年交费标准,
Max(Case When 年级 = 交费年度 - 1 Then 学生交费标准 Else Null End) As 第二年交费标准,
Max(Case When 年级 = 交费年度 - 1 Then 已交学费 Else Null End) As 第二年已交费用,
Max(Case When 年级 = 交费年度 - 2 Then 学生交费标准 Else Null End) As 第三年交费标准,
Max(Case When 年级 = 交费年度 - 2 Then 已交学费 Else Null End) As 第三年已交费用,
Max(Case When 年级 = 交费年度 - 3 Then 学生交费标准 Else Null End) As 第四年交费标准,
Max(Case When 年级 = 交费年度 - 3 Then 已交学费 Else Null End) As 第四年已交费用
From
TEST
Group By
学生ID
GO
--刪除測試環境
Drop Table TEST
--結果
/*
学生ID 第一年交费标准 第一年交费标准 第二年交费标准 第二年已交费用 第三年交费标准 第三年已交费用 第四年交费标准 第四年已交费用
2006001 7600 7600 6600 6600 NULL NULL NULL NULL
2006002 7600 7600 6600 6600 NULL NULL NULL NULL
2007001 7000 7000 NULL NULL NULL NULL NULL NULL
*/
Create Table TEST
(学生ID Char(7),
学生交费标准 Int,
已交学费 Int,
交费年度 Int,
年级 Int)
Insert TEST Select '2006001', 7600, 7600, 2006, 2006
Union All Select '2006001', 6600, 6600, 2007, 2006
Union All Select '2006002', 7600, 7600, 2006, 2006
Union All Select '2006002', 6600, 6600, 2007, 2006
Union All Select '2007001', 7000, 7000, 2007, 2007
GO
--测试
Declare @S Varchar(8000)
Select @S = 'Select 学生ID'
Select @S = @S + ', Max(Case When 年级 = 交费年度 - ' + Cast(年度 As Varchar) + ' Then 学生交费标准 Else Null End) As 第' + Cast(年度 + 1 As Varchar) + '年交费标准,
Max(Case When 年级 = 交费年度 - ' + Cast(年度 As Varchar) + ' Then 已交学费 Else Null End) As 第' + Cast(年度 + 1 As Varchar) + '年已交费用'
From (Select Distinct 交费年度 - 年级 As 年度 From TEST) A Order By 年度
Select @S = @S + ' From TEST Group By 学生ID'
EXEC(@S)
GO
--删除测试环境
Drop Table TEST
--结果
/*
学生ID 第1年交费标准 第1年已交费用 第2年交费标准 第2年已交费用
2006001 7600 7600 6600 6600
2006002 7600 7600 6600 6600
2007001 7000 7000 NULL NULL
*/
if exists(select * form sysobjects where name='t_stu')
BEGIN
DROP TABLE t_stu
END
create table t_stu(学生ID int null,学生交费标准每年 int null,已交学费每年 int null,交费年度 int null,年级 int null)
insert into t_stu(学生ID,学生交费标准每年,已交学费每年,交费年度,年级)
select
2006001, 7600, 7600, 2006, 2006 union all select
2006001, 6600, 6600, 2007, 2006 union all select
2006002, 7600, 7600, 2006, 2006 union all select
2006002, 6600, 6600, 2007, 2006 union all select
2007001, 7000, 7000, 2007, 2007declare @sql varchar(8000)
set @sql=''
select @sql=@sql+'max(case when 交费年度=cast('+cast(t.交费年度 as varchar(20))+' as int) then 学生交费标准每年 else 0 end )
as 第'+cast(t.交费年度 as varchar(20)) +'年度交费标准 ,max(case when 交费年度=cast('+cast(t.交费年度 as varchar(20))+' as int) then 已交学费每年 else 0 end ) as 第'+cast(t.交费年度 as varchar(20)) +'已交学费 ,'
from (select distinct 交费年度 from t_stu ) as t
print @sql
select @sql=substring(@SQL,1,LEN(@SQL)-1)SELECT @SQL='SELECT 学生ID,'+@SQL+' FROM T_STU GROUP BY 学生ID'
PRINT @SQLEXEC(@SQL)drop table t_stu
谢谢各位! 如果要统计一下总的欠费金额 怎么写?
-------------
修改一點即可
--固定的寫法
Select
学生ID,
Max(Case When 年级 = 交费年度 Then 学生交费标准 Else Null End) As 第一年交费标准,
Max(Case When 年级 = 交费年度 Then 已交学费 Else Null End) As 第一年交费标准,
Max(Case When 年级 = 交费年度 - 1 Then 学生交费标准 Else Null End) As 第二年交费标准,
Max(Case When 年级 = 交费年度 - 1 Then 已交学费 Else Null End) As 第二年已交费用,
Max(Case When 年级 = 交费年度 - 2 Then 学生交费标准 Else Null End) As 第三年交费标准,
Max(Case When 年级 = 交费年度 - 2 Then 已交学费 Else Null End) As 第三年已交费用,
Max(Case When 年级 = 交费年度 - 3 Then 学生交费标准 Else Null End) As 第四年交费标准,
Max(Case When 年级 = 交费年度 - 3 Then 已交学费 Else Null End) As 第四年已交费用,
SUM(学生交费标准 - 已交学费) As 总欠费金额
From
TEST
Group By
学生ID--動態的寫法Declare @S Varchar(8000)
Select @S = 'Select 学生ID'
Select @S = @S + ', Max(Case When 年级 = 交费年度 - ' + Cast(年度 As Varchar) + ' Then 学生交费标准 Else Null End) As 第' + Cast(年度 + 1 As Varchar) + '年交费标准,
Max(Case When 年级 = 交费年度 - ' + Cast(年度 As Varchar) + ' Then 已交学费 Else Null End) As 第' + Cast(年度 + 1 As Varchar) + '年已交费用'
From (Select Distinct 交费年度 - 年级 As 年度 From TEST) A Order By 年度
Select @S = @S + ', SUM(学生交费标准 - 已交学费) As 总欠费金额 From TEST Group By 学生ID'
EXEC(@S)