有两个表:
1.成绩分段表(ID为自增列)
ID MaxFen MinFen
--------------------
1 510 500
2 500 490
3 490 4802.总成绩表
ClassID StudentID SumFen(总分)
------------------------------------
000005 000001 503
000005 000003 498
000004 000006 487
000004 000003 5013.班级表
ClassID ClassName
-----------------------
000004 104班
000005 105班要求结果:
≥500 ≥490 ≥480
----------------------------------------
105班 1 1
104班 1 1 总分分段值是随机的,最多30个分段
1.成绩分段表(ID为自增列)
ID MaxFen MinFen
--------------------
1 510 500
2 500 490
3 490 4802.总成绩表
ClassID StudentID SumFen(总分)
------------------------------------
000005 000001 503
000005 000003 498
000004 000006 487
000004 000003 5013.班级表
ClassID ClassName
-----------------------
000004 104班
000005 105班要求结果:
≥500 ≥490 ≥480
----------------------------------------
105班 1 1
104班 1 1 总分分段值是随机的,最多30个分段
SET @s = N''
SELECT @s = @s + N','
+ QUOTENAME('≥' + RTRIM(MinFen))
+ N'=SUM(CASE WHEN SumFen>=' + RTRIM(MinFen)
+ N' AND SumFen<' + RTRIM(MaxFen)
+ N' THEN 1 END)'
FROM 成绩分段表
ORDER BY ID
EXEC(N'
SELECT ClassName ' + @s + N'
FROM(
SELECT C.ClassName, SumFen = SUM(B.SumFen)
FROM 班级表 C, 总成绩表 B
WHERE C.ClassID = B.ClassID
GROUP BY C.ClassName
)A
GROUP BY ClassName')
SET @s = N''
SELECT @s = @s + N','
+ QUOTENAME('≥' + RTRIM(MinFen))
+ N'=SUM(CASE WHEN B.SumFen>=' + RTRIM(MinFen)
+ N' AND SumFen<' + RTRIM(MaxFen)
+ N' THEN 1 END)'
FROM 成绩分段表
ORDER BY ID
EXEC(N'
SELECT C.ClassName' + @s + N'
FROM 班级表 C, 总成绩表 B
WHERE C.ClassID = B.ClassID
GROUP BY C.ClassName
')
GO
CREATE TABLE 成绩分段表(
ID int IDENTITY, MaxFen int, MinFen int)
INSERT 成绩分段表
SELECT 510, 500 UNION ALL
SELECT 500, 490 UNION ALL
SELECT 490, 480CREATE TABLE 总成绩表(
ClassID varchar(10), StudentID varchar(10), SumFen int)
INSERT 总成绩表
SELECT '000005', '000001', 503 UNION ALL
SELECT '000005', '000003', 498 UNION ALL
SELECT '000004', '000006', 487 UNION ALL
SELECT '000004', '000003', 501CREATE TABLE 班级表(
ClassID varchar(10), ClassName varchar(10))
INSERT 班级表
SELECT '000004', '104班' UNION ALL
SELECT '000005', '105班'
GO-- 查询
DECLARE @s nvarchar(4000)
SET @s = N''
SELECT @s = @s + N','
+ QUOTENAME('≥' + RTRIM(MinFen))
+ N'=SUM(CASE WHEN B.SumFen>=' + RTRIM(MinFen)
+ N' AND SumFen<' + RTRIM(MaxFen)
+ N' THEN 1 END)'
FROM 成绩分段表
ORDER BY ID
EXEC(N'
SELECT C.ClassName' + @s + N'
FROM 班级表 C, 总成绩表 B
WHERE C.ClassID = B.ClassID
GROUP BY C.ClassName
')
GO-- 删除测试
DROP TABLE 成绩分段表, 总成绩表, 班级表
104班 1 NULL 1
105班 1 1 NULL
如果我的成绩分段表为:1.成绩分段表(ID为自增列)
ID MinFen
--------------------
1 500
2 490
3 480
这样语句应该如何来写
select 1 , 510 , 500 union
select 2 , 500 , 490 union
select 3 , 490 , 480
create table #1 (classid varchar(06) , studentid varchar(06) , sumfen int)
insert into #1
select '000005', '000001', 503 union
select '000005', '000003', 498 union
select '000004', '000006', 487 union
select '000004', '000003', 501create table #2 (classid varchar(06) , classname varchar(10))
insert into #2
select '000004', '104班' union
select '000005', '105班'select c.classname ,
b.sumfen into #3
from #1 b , #2 c
where c.classid = b.classidselect * from #3
declare @s varchar(8000)
set @s = ''
select @s = @s + ',' + 'sum( case when sumfen >= ' + cast( minfen as varchar) + ' and sumfen < ' + cast( maxfen as varchar )
+ ' then 1 else 0 end ) as ''≥ ' + cast (minfen as varchar) + ' '' '
from #select @s = 'select classname ' + @s +' from #3 group by classname'
exec(@s)
drop table #
drop table #1
drop table #2
drop table #3
-------
QUOTENAME:把≥500变换成[≥500],以符合sql命名规则
RTRIM:数字型强行转化成字符型,可以用CAST(MinFen as varchar) 代替
还有个问题就是:
如果我的成绩分段表为:1.成绩分段表(ID为自增列)
ID MinFen
--------------------
1 500
2 490
3 480
这样语句应该如何来写
------------------------------------------
可以这样:
-- 查询
DECLARE @s nvarchar(4000)
SET @s = N''
SELECT @s = @s + N','
+ QUOTENAME('≥' + RTRIM(MinFen))
+ N'=SUM(CASE WHEN B.SumFen>=' + RTRIM(MinFen)
+ N' THEN 1 END)'
FROM 成绩分段表
ORDER BY MinFen desc
EXEC(N'
SELECT C.ClassName' + @s + N'
FROM 班级表 C, 总成绩表 B
WHERE C.ClassID = B.ClassID
GROUP BY C.ClassName
')
ID MinFen
--------------------
1 500
2 490
3 480
这样语句应该如何来写
---------------declare @s varchar(8000)
set @s = ''
select @s = @s + ',' + case when id = 1 then
'sum( case when sumfen >= ' + cast( minfen as varchar) +
' then 1 else 0 end ) as ''≥ ' + cast (minfen as varchar) + ' '' '
else
'sum( case when sumfen >= ' + cast( minfen as varchar) + ' and sumfen < '
+ cast ( ( select minfen from # where id = a.id - 1) as varchar )
+ ' then 1 else 0 end ) as ''≥ ' + cast (minfen as varchar) + ' '' '
end
from # aselect @s = 'select classname ' + @s +' from #3 group by classname'exec(@s)
CREATE TABLE 成绩分段表(
ID int IDENTITY, MinFen int)
INSERT 成绩分段表
SELECT 500 UNION ALL
SELECT 490 UNION ALL
SELECT 480CREATE TABLE 总成绩表(
ClassID varchar(10), StudentID varchar(10), SumFen int)
INSERT 总成绩表
SELECT '000005', '000001', 503 UNION ALL
SELECT '000005', '000003', 498 UNION ALL
SELECT '000004', '000006', 487 UNION ALL
SELECT '000004', '000003', 501CREATE TABLE 班级表(
ClassID varchar(10), ClassName varchar(10))
INSERT 班级表
SELECT '000004', '104班' UNION ALL
SELECT '000005', '105班'
GO-- 查询
DECLARE @var int
SET @var =1000DECLARE @s nvarchar(4000)
SET @s = N''
SELECT @s = @s + N','
+ QUOTENAME('≥' + RTRIM(MinFen))
+ N'=SUM(CASE WHEN B.SumFen>=' + RTRIM(MinFen)
+ N' AND SumFen<' + RTRIM(@var)
+ N' THEN 1 END)',@var=MinFen
FROM 成绩分段表
ORDER BY ID
select @s
EXEC(N'
SELECT C.ClassName' + @s + N'
FROM 班级表 C, 总成绩表 B
WHERE C.ClassID = B.ClassID
GROUP BY C.ClassName
')
-- 删除测试
DROP TABLE 成绩分段表, 总成绩表, 班级表
minFen是整数类型,当转化成字符串类型的时候,右边会加上空格,所以用RTRIM
QUOTENAME,可能是因为">="是关键字哈,为了规范,最好用QUOTENAME加上"[>=500]"这个符号.
我的个人想法,不知道对不对
ID MinFen
--------------------
1 500
2 490
3 480
这样语句应该如何来写
--- 意味着没有向上封顶而已, 只需要:
DECLARE @s nvarchar(4000)
SET @s = N''
SELECT @s = @s + N','
+ QUOTENAME('≥' + RTRIM(MinFen))
+ N'=SUM(CASE WHEN B.SumFen>=' + RTRIM(MinFen)
+ N' THEN 1 END)'
FROM 成绩分段表
ORDER BY ID
EXEC(N'
SELECT C.ClassName' + @s + N'
FROM 班级表 C, 总成绩表 B
WHERE C.ClassID = B.ClassID
GROUP BY C.ClassName
')
GO
SET @a = 500
SELECT
CASE
WHEN @a > 500 THEN '>500'
WHEN @a > 400 THEN '>400'
WHEN @a > 300 THEN '>300'
ELSE 'other' END
ORDER BY ID
貌似不妥,冒牌认为应该
ORDER BY MinFen desc
http://community.csdn.net/Expert/topic/5304/5304839.xml?temp=.9209101
1.成绩分段表(ID为自增列)
ID MinFen
--------------------
1 500
2 490
3 480
这样语句应该如何来写上面的答案会出很多重复的数据