高难度问题

chinabdx 2008-12-31 10:05:56
zjcxc
12 1 02 冷藏乳制品 13 1
12 1 03 冷冻食品 6 1
12 1 05 常温干货 15 2
12 1 07 熟食 22 7
12 1 08 非熟食 8 4
12 1 10 海产 3 1
12 1 11 加工 10 1
12 1 12 蔬果 163 26
12 1 13 面包 20 3
12 1 14 家畜 107 6
12 1 20 米面粉类 38 1
12 1 21 厨房调料 276 6
12 1 26 一般饮料 5 1
12 1 27 乳品饮料 2 1
12 1 30 国产酒 5 1
12 1 33 奶粉、调制 65 3
12 1 35 一般饼干 31 4
12 1 37 包装休闲小食品 6 2
12 1 38 散装休闲小食品 22 2
12 1 40 家用清洁用品 6416 3
12 1 41 个人清洁用品 6068 3
12 1 42 护肤品、彩妆 19 1
12 1 43 日化卫生用品 1337 2
12 1 44 纸类用品 6573 2
12 1 78 童装 30 1
12 1 81 袜子、丝袜 15 2
12 1 98 超市购物袋 1 11
12 10 02 冷藏乳制品 4 1
12 10 05 常温干货 29 3
12 10 07 熟食 17 1
12 10 08 非熟食 17 2
12 10 11 加工 11 2
12 10 12 蔬果 202 23
12 10 13 面包 5 1
12 10 14 家畜 50 5
12 10 15 家禽 62 4
12 10 20 米面粉类 10 1
12 10 21 厨房调料 135 5
12 10 22 罐头食品 6 1
12 10 26 一般饮料 19 1
12 10 30 国产酒 8 1
12 10 32 冲饮食品 12 1
12 10 33 奶粉、调制 10 1
12 10 35 一般饼干 21 4
12 10 36 糖果巧克力 19 2
12 10 37 包装休闲小食品 4 1
12 10 38 散装休闲小食品 18 2
12 10 40 家用清洁用品 36 4
12 10 41 个人清洁用品 90 4
12 10 43 日化卫生用品 17 4
12 10 44 纸类用品 64 5
12 10 46 家用容器 18 1
12 10 51 清洁卫生浴用品 8 2
12 10 58 家私 5 1
12 10 76 婴儿用品 96 1
12 10 98 超市购物袋 1 11
12 11 02 冷藏乳制品 38 2
12 11 05 常温干货 14 1
12 11 07 熟食 7 3
12 11 08 非熟食 21 1
12 11 11 加工 14 1
12 11 12 蔬果 152 19
12 11 14 家畜 116 6
12 11 15 家禽 15 1
12 11 17 骨头 4 1
12 11 19 五谷类 66 2
12 11 20 米面粉类 10 1
12 11 21 厨房调料 131 5
12 11 26 一般饮料 15 4
12 11 27 乳品饮料 41 2
12 11 32 冲饮食品 8 2
12 11 33 奶粉、调制 645 1
12 11 35 一般饼干 16 2
12 11 40 家用清洁用品 34 5
12 11 41 个人清洁用品 29 3
12 11 43 日化卫生用品 13 3
12 11 44 纸类用品 65 7
12 11 51 清洁卫生浴用品 9 2
12 11 58 家私 4 2
12 11 98 超市购物袋 2 13
12 12 01 冷藏 45 1
12 12 02 冷藏乳制品 8 2
12 12 03 冷冻食品 35 2
12 12 05 常温干货 46 5
12 12 07 熟食 51 5
12 12 08 非熟食 9 1
12 12 09 鱼 15 1
12 12 10 海产 22 2
12 12 11 加工 11 3
12 12 12 蔬果 315 31
12 12 13 面包 67 5
12 12 14 家畜 58 3
12 12 15 家禽 33 1
12 12 17 骨头 4 1
12 12 19 五谷类 5 1
12 12 21 厨房调料 352 4
12 12 23 南北干货 28 2
12 12 26 一般饮料 3 1
12 12 27 乳品饮料 127 5
12 12 30 国产酒 96 1
12 12 32 冲饮食品 22 2
12 12 33 奶粉、调制 96 2
12 12 35 一般饼干 43 5
12 12 36 糖果巧克力 12 2
12 12 37 包装休闲小食品 15 3
12 12 38 散装休闲小食品 12 1
12 12 40 家用清洁用品 9 1
12 12 41 个人清洁用品 63 3
12 12 43 日化卫生用品 6 2
12 12 44 纸类用品 20 2
12 12 48 一次性用品 3 1
12 12 81 袜子、丝袜 7 1
12 12 98 超市购物袋 2 17
12 13 01 冷藏 4 1
12 13 02 冷藏乳制品 46 2
12 13 03 冷冻食品 26 3
12 13 05 常温干货 18 3
12 13 07 熟食 61 10
12 13 10 海产 26 2
12 13 11 加工 12 3
12 13 12 蔬果 148 17
12 13 13 面包 56 6
12 13 14 家畜 73 5
12 13 15 家禽 45 2
12 13 17 骨头 30 1
12 13 19 五谷类 15 1
12 13 20 米面粉类 43 2
12 13 21 厨房调料 19 4
12 13 24 散南北干货 15 2
12 13 26 一般饮料 31 1
12 13 27 乳品饮料 310 4
12 13 28 罐头饮料 4 1
12 13 32 冲饮食品 28 2
12 13 33 奶粉、调制 952 6
12 13 35 一般饼干 108 9
12 13 36 糖果巧克力 26 4
12 13 37 包装休闲小食品 42 4
12 13 38 散装休闲小食品 75 6
12 13 40 家用清洁用品 3 1
12 13 41 个人清洁用品 25 1
12 13 43 日化卫生用品 4 1
12 13 44 纸类用品 15 2
12 13 65 玩具 17 1
12 13 70 拖鞋 20 1
12 13 81 袜子、丝袜 12 1
12 13 98 超市购物袋 4 27
12 14 01 冷藏 7 1
12 14 02 冷藏乳制品 50 2
12 14 03 冷冻食品 37 2
12 14 05 常温干货 46 4
12 14 07 熟食 74 8
12 14 11 加工 37 9
12 14 12 蔬果 204 21
12 14 13 面包 43 6
12 14 14 家畜 67 4
12 14 15 家禽 48 1
12 14 19 五谷类 3 1
12 14 20 米面粉类 42 3
12 14 21 厨房调料 113 6
12 14 22 罐头食品 13 1
12 14 23 南北干货 10 2
12 14 24 散南北干货 13 4
12 14 26 一般饮料 5 2
12 14 27 乳品饮料 54 1
12 14 32 冲饮食品 39 3
12 14 33 奶粉、调制 15 1
12 14 34 营养保健品 215 1
12 14 35 一般饼干 48 7
12 14 37 包装休闲小食品 7 3
12 14 38 散装休闲小食品 36 3
12 14 40 家用清洁用品 16 2
12 14 41 个人清洁用品 126 3
12 14 42 护肤品、彩妆 27 3
12 14 43 日化卫生用品 16 1
12 14 44 纸类用品 48 3
12 14 47 碗盘、餐具 12 1
12 14 78 童装 14 1
12 14 98 超市购物袋 2 15
12 15 02 冷藏乳制品 20 1
12 15 03 冷冻食品 11 1
12 15 05 常温干货 61 4
12 15 07 熟食 10 2
12 15 11 加工 3 1
12 15 12 蔬果 116 15
12 15 13 面包 10 1
12 15 14 家畜 81 3
12 15 20 米面粉类 6 1
12 15 21 厨房调料 3 1
12 15 23 南北干货 10 1
12 15 24 散南北干货 7 1
12 15 26 一般饮料 67 2
12 15 30 国产酒 41 1
12 15 32 冲饮食品 14 1
12 15 35 一般饼干 18 2
12 15 36 糖果巧克力 1 1
12 15 38 散装休闲小食品 20 2
12 15 40 家用清洁用品 14 2
12 15 41 个人清洁用品 12 1
12 15 44 纸类用品 65 3
12 15 48 一次性用品 6 1
12 15 52 自行车配件 29 1
12 15 98 超市购物袋 1 7
12 16 01 冷藏 8 1
12 16 02 冷藏乳制品 73 7
12 16 03 冷冻食品 31 3
12 16 05 常温干货 102 6
12 16 07 熟食 40 7
12 16 08 非熟食 15 1
12 16 09 鱼 15 1
12 16 11 加工 13 2
12 16 12 蔬果 165 23
12 16 13 面包 15 3
12 16 14 家畜 86 5
12 16 15 家禽 10 1
12 16 17 骨头 43 2
12 16 20 米面粉类 21 2
12 16 21 厨房调料 121 7
12 16 23 南北干货 30 1
12 16 24 散南北干货 14 2
12 16 26 一般饮料 6 1
12 16 27 乳品饮料 28 1
12 16 35 一般饼干 64 6
12 16 37 包装休闲小食品 2 1
12 16 38 散装休闲小食品 24 3
12 16 40 家用清洁用品 8 2
12 16 41 个人清洁用品 44 3
12 16 43 日化卫生用品 44 3
12 16 44 纸类用品 121 10
12 16 98 超市购物袋 3 16
12 17 01 冷藏 22 1
12 17 02 冷藏乳制品 20 1
12 17 03 冷冻食品 9 1
12 17 05 常温干货 38 3
12 17 07 熟食 44 9
12 17 11 加工 15 3
12 17 12 蔬果 182 22
12 17 14 家畜 46 2
12 17 15 家禽 25 1
12 17 19 五谷类 15 1
12 17 20 米面粉类 14 3
12 17 21 厨房调料 58 4
12 17 22 罐头食品 4 1
12 17 23 南北干货 9 2
12 17 26 一般饮料 25 5
12 17 27 乳品饮料 127 3
12 17 33 奶粉、调制 33 1
12 17 35 一般饼干 7 1
12 17 36 糖果巧克力 2 1
12 17 37 包装休闲小食品 7 3
12 17 38 散装休闲小食品 3 1
12 17 40 家用清洁用品 13 1
12 17 43 日化卫生用品 25 2
12 17 44 纸类用品 14 2
12 17 58 家私 3 1
12 17 68 礼品 1 1
12 17 76 婴儿用品 16 1
12 17 98 超市购物袋 1 14
12 18 02 冷藏乳制品 10 1
12 18 05 常温干货 11 2
12 18 07 熟食 14 2
12 18 08 非熟食 9 2
12 18 11 加工 14 2
12 18 12 蔬果 107 18
12 18 13 面包 28 1
12 18 14 家畜 59 3
12 18 17 骨头 5 1
12 18 20 米面粉类 16 2
12 18 21 厨房调料 46 5
12 18 24 散南北干货 9 2
12 18 26 一般饮料 5 1
12 18 27 乳品饮料 13 1
12 18 33 奶粉、调制 20 1
12 18 35 一般饼干 27 2
12 18 37 包装休闲小食品 4 2
12 18 42 护肤品、彩妆 12 2
12 18 43 日化卫生用品 12 2
12 18 47 碗盘、餐具 4 1
12 18 98 超市购物袋 1 9
12 19 01 冷藏 15 1
12 19 02 冷藏乳制品 67 7
12 19 05 常温干货 50 5
12 19 08 非熟食 20 1
12 19 10 海产 5 1
12 19 11 加工 3 1
12 19 12 蔬果 361 53
12 19 13 面包 32 5
12 19 14 家畜 95 6
12 19 17 骨头 11 1
12 19 19 五谷类 727 16
12 19 20 米面粉类 19 3
12 19 21 厨房调料 1792 17
12 19 24 散南北干货 5 1
12 19 26 一般饮料 38 4
12 19 27 乳品饮料 4 1
12 19 30 国产酒 10 1
12 19 32 冲饮食品 4 1
12 19 33 奶粉、调制 16 3
12 19 35 一般饼干 11 3
12 19 36 糖果巧克力 30 4
12 19 37 包装休闲小食品 10 2
12 19 40 家用清洁用品 102 6
12 19 41 个人清洁用品 44 5
12 19 42 护肤品、彩妆 1 1
12 19 43 日化卫生用品 25 5
12 19 44 纸类用品 20 1
12 19 46 家用容器 30 1
12 19 51 清洁卫生浴用品 4 1
12 19 68 礼品 18 4
12 19 81 袜子、丝袜 11 2
12 19 98 超市购物袋 2 18
如何将汉字这一更用更快捷的方法转换成列名呢?
...全文
343 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
oraclelogan 2008-12-31
  • 打赏
  • 举报
回复
有难度啊,学习了!
adan20042008 2008-12-31
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lgxyz 的回复:]
12 1 02 冷藏乳制品 13 1
这字段值对应的字段名是什么
是不是还要统计什么的
(特别是 13 1 这是什么东西)
问的不够详细吧
[/Quote]

同意楼上说的,越是高难度问题就应该描述得越详细!
lgxyz 2008-12-31
  • 打赏
  • 举报
回复
--> --> (Ben)生成測試數據

if not object_id('tb') is null
drop table tb
Go
Create table tb([月] int,[日] int,[编号] nvarchar(2),[名称] nvarchar(7),[数量] int,[单价] int)
Insert tb
select 12,1,N'02',N'冷藏乳制品',13,1 union all
select 12,1,N'03',N'冷冻食品',6,1 union all
select 12,1,N'05',N'常温干货',15,2 union all
select 12,1,N'07',N'熟食',22,7 union all
.
.
.
.


DECLARE @s nvarchar(4000)

SET @s='SELECT 月,日 '
SELECT @s=@s+','+QUOTENAME(名称)
+N'=ISNULL(SUM(CASE 名称 WHEN '+QUOTENAME(名称,N'''')
+N' THEN 数量*单价 END),0)'
FROM tb
GROUP BY 名称

EXEC(@s+N'
FROM tb
GROUP BY 月,日')

/*
月 日 包装休闲小食品 常温干货 超市购物袋 冲饮食品 厨房调料 非熟食 个人清洁用品 骨头 罐头食品 罐头饮料 国 国产酒 海产 护肤品、彩妆 加工 家禽 家私 家畜 家用清洁用品 家用容器 冷藏 冷藏乳制品 冷冻食品 米面粉类 面包 奶粉、调制 南北干货 清洁卫生浴用品 日化卫生用品 乳品饮料 散南北干货 散装休闲小食品 蔬果 熟食 糖果巧克力 童装 拖鞋 袜子、丝袜 玩具 碗盘、餐具 五谷类 一般饼干 一般饮料 一次性用品 婴儿用品 营养保健品 鱼 纸类用品
----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
12 1 12 30 11 0 1656 32 18204 0 0 0 0 5 3 19 10 0 0 642 19248 0 0 13 6 38 60 195 0 0 2674 2 0 44 4238 154 0 30 0 30 0 0 0 124 5 0 0 0 0 13146
12 10 4 87 11 12 675 34 360 0 6 0 0 8 0 0 22 248 5 250 144 18 0 4 0 10 5 10 0 16 68 0 0 36 4646 17 38 0 0 0 0 0 0 84 19 0 96 0 0 320
12 11 0 14 26 16 655 21 87 4 0 0 0 0 0 0 14 15 8 696 170 0 0 76 0 10 0 645 0 18 39 82 0 0 2888 21 0 0 0 0 0 0 132 32 60 0 0 0 0 455
12 12 45 230 34 44 1408 9 189 4 0 0 0 96 44 0 33 33 0 174 9 0 45 16 70 0 335 192 56 0 12 635 0 12 9765 255 24 0 0 7 0 0 5 215 3 3 0 0 15 40
12 13 168 54 108 56 76 0 25 30 0 4 0 0 52 0 36 90 0 365 3 0 4 92 78 86 336 5712 0 0 4 1240 30 450 2516 610 104 0 20 12 17 0 15 972 31 0 0 0 0 30
12 14 21 184 30 117 678 0 378 0 13 0 0 0 0 81 333 48 0 268 32 0 7 100 74 126 258 15 20 0 16 54 52 108 4284 592 0 14 0 0 0 12 3 336 10 0 0 215 0 144
12 15 0 244 0 0 3 0 0 0 0 0 0 0 0 0 3 0 0 243 0 0 0 20 11 6 10 0 10 0 0 0 7 0 1740 20 0 0 0 0 0 0 0 0 134 0 0 0 0 0

*/


不知道是不是这样的
zjcxc 2008-12-31
  • 打赏
  • 举报
回复
问题描述不清楚
你的原始表是怎么样的?
你需要的结果是什么?
lgxyz 2008-12-31
  • 打赏
  • 举报
回复
12 1 02 冷藏乳制品 13 1
这字段值对应的字段名是什么
是不是还要统计什么的
(特别是 13 1 这是什么东西)
问的不够详细吧
快乐_石头 2008-12-31
  • 打赏
  • 举报
回复
普通行列转换
问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果):
姓名 语文 数学 物理
---- ---- ---- ----
李四 74 84 94
张三 74 83 93
-------------------
*/

create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
go

--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
select 姓名 as 姓名 ,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理
from tb
group by 姓名

--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql)

--SQL SERVER 2005 静态SQL。
select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b

--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')

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

/*
问题:在上述结果的基础上加平均分,总分,得到如下结果:
姓名 语文 数学 物理 平均分 总分
---- ---- ---- ---- ------ ----
李四 74 84 94 84.00 252
张三 74 83 93 83.33 250
*/

--SQL SERVER 2000 静态SQL。
select 姓名 姓名,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理,
cast(avg(分数*1.0) as decimal(18,2)) 平均分,
sum(分数) 总分
from tb
group by 姓名

--SQL SERVER 2000 动态SQL。
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名'
exec(@sql)

--SQL SERVER 2005 静态SQL。
select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b) m,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名

--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
exec ('select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b) m ,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名')

drop table tb

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

/*
问题:如果上述两表互相换一下:即表结构和数据为:
姓名 语文 数学 物理
张三 74  83  93
李四 74  84  94
想变成(得到如下结果):
姓名 课程 分数
---- ---- ----
李四 语文 74
李四 数学 84
李四 物理 94
张三 语文 74
张三 数学 83
张三 物理 93
--------------
*/

create table tb(姓名 varchar(10) , 语文 int , 数学 int , 物理 int)
insert into tb values('张三',74,83,93)
insert into tb values('李四',74,84,94)
go

--SQL SERVER 2000 静态SQL。
select * from
(
select 姓名 , 课程 = '语文' , 分数 = 语文 from tb
union all
select 姓名 , 课程 = '数学' , 分数 = 数学 from tb
union all
select 姓名 , 课程 = '物理' , 分数 = 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 end

--SQL SERVER 2000 动态SQL。
--调用系统表动态生态。
declare @sql varchar(8000)
select @sql = isnull(@sql + ' union all ' , '' ) + ' select 姓名 , [课程] = ' + quotename(Name , '''') + ' , [分数] = ' + quotename(Name) + ' from tb'
from syscolumns
where name! = N'姓名' and ID = object_id('tb') --表名tb,不包含列名为姓名的其它列
order by colid asc
exec(@sql + ' order by 姓名 ')

--SQL SERVER 2005 动态SQL。
select 姓名 , 课程 , 分数 from tb unpivot (分数 for 课程 in([语文] , [数学] , [物理])) t

--SQL SERVER 2005 动态SQL,同SQL SERVER 2000 动态SQL。

--------------------
/*
问题:在上述的结果上加个平均分,总分,得到如下结果:
姓名 课程 分数
---- ------ ------
李四 语文 74.00
李四 数学 84.00
李四 物理 94.00
李四 平均分 84.00
李四 总分 252.00
张三 语文 74.00
张三 数学 83.00
张三 物理 93.00
张三 平均分 83.33
张三 总分 250.00
------------------
*/

select * from
(
select 姓名 as 姓名 , 课程 = '语文' , 分数 = 语文 from tb
union all
select 姓名 as 姓名 , 课程 = '数学' , 分数 = 数学 from tb
union all
select 姓名 as 姓名 , 课程 = '物理' , 分数 = 物理 from tb
union all
select 姓名 as 姓名 , 课程 = '平均分' , 分数 = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb
union all
select 姓名 as 姓名 , 课程 = '总分' , 分数 = 语文 + 数学 + 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 end

drop table tb
csdyyr 2008-12-31
  • 打赏
  • 举报
回复
动态SQL
dobear_0922 2008-12-31
  • 打赏
  • 举报
回复
帮顶
nettman 2008-12-31
  • 打赏
  • 举报
回复
学习!
lgxyz 2008-12-31
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 chinawwl2008 的回复:]
Create table tb([月] int,[日] int,[编号] nvarchar(2),[名称] nvarchar(7),[数量] int,[单价] int)
Insert tb
select 12,1,N'02',N'冷藏乳制品',13,1 union all
select 12,1,N'03',N'冷冻食品',6,1 union all
select 12,1,N'05',N'常温干货',15,2 union all
select 12,1,N'07',N'熟食',22,7 union all
.
6楼这儿还是要指定类别名称来进行插入呢
[/Quote]

-_-!!

我晕,这是我创建测试数据表的,用来下面查询测试的数据,要不怎么测试。。。。。。。。。。。。。
你是不是看错了,查询语句在下面啊!
dawugui 2008-12-31
  • 打赏
  • 举报
回复
--就是行列转换,参考如下:


/*
标题:普通行列转换(version 2.0)
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-03-09
地点:广东深圳
说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。

问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果):
姓名 语文 数学 物理
---- ---- ---- ----
李四 74 84 94
张三 74 83 93
-------------------
*/

create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
go

--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
select 姓名 as 姓名 ,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理
from tb
group by 姓名

--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql)

--SQL SERVER 2005 静态SQL。
select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b

--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
set @sql = '[' + @sql + ']'
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')

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

/*
问题:在上述结果的基础上加平均分,总分,得到如下结果:
姓名 语文 数学 物理 平均分 总分
---- ---- ---- ---- ------ ----
李四 74 84 94 84.00 252
张三 74 83 93 83.33 250
*/

--SQL SERVER 2000 静态SQL。
select 姓名 姓名,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理,
cast(avg(分数*1.0) as decimal(18,2)) 平均分,
sum(分数) 总分
from tb
group by 姓名

--SQL SERVER 2000 动态SQL。
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名'
exec(@sql)

--SQL SERVER 2005 静态SQL。
select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b) m,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名

--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
exec ('select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b) m ,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名')

drop table tb

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

/*
问题:如果上述两表互相换一下:即表结构和数据为:
姓名 语文 数学 物理
张三 74  83  93
李四 74  84  94
想变成(得到如下结果):
姓名 课程 分数
---- ---- ----
李四 语文 74
李四 数学 84
李四 物理 94
张三 语文 74
张三 数学 83
张三 物理 93
--------------
*/

create table tb(姓名 varchar(10) , 语文 int , 数学 int , 物理 int)
insert into tb values('张三',74,83,93)
insert into tb values('李四',74,84,94)
go

--SQL SERVER 2000 静态SQL。
select * from
(
select 姓名 , 课程 = '语文' , 分数 = 语文 from tb
union all
select 姓名 , 课程 = '数学' , 分数 = 数学 from tb
union all
select 姓名 , 课程 = '物理' , 分数 = 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 end

--SQL SERVER 2000 动态SQL。
--调用系统表动态生态。
declare @sql varchar(8000)
select @sql = isnull(@sql + ' union all ' , '' ) + ' select 姓名 , [课程] = ' + quotename(Name , '''') + ' , [分数] = ' + quotename(Name) + ' from tb'
from syscolumns
where name! = N'姓名' and ID = object_id('tb') --表名tb,不包含列名为姓名的其它列
order by colid asc
exec(@sql + ' order by 姓名 ')

--SQL SERVER 2005 动态SQL。
select 姓名 , 课程 , 分数 from tb unpivot (分数 for 课程 in([语文] , [数学] , [物理])) t

--SQL SERVER 2005 动态SQL,同SQL SERVER 2000 动态SQL。

--------------------
/*
问题:在上述的结果上加个平均分,总分,得到如下结果:
姓名 课程 分数
---- ------ ------
李四 语文 74.00
李四 数学 84.00
李四 物理 94.00
李四 平均分 84.00
李四 总分 252.00
张三 语文 74.00
张三 数学 83.00
张三 物理 93.00
张三 平均分 83.33
张三 总分 250.00
------------------
*/

select * from
(
select 姓名 as 姓名 , 课程 = '语文' , 分数 = 语文 from tb
union all
select 姓名 as 姓名 , 课程 = '数学' , 分数 = 数学 from tb
union all
select 姓名 as 姓名 , 课程 = '物理' , 分数 = 物理 from tb
union all
select 姓名 as 姓名 , 课程 = '平均分' , 分数 = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb
union all
select 姓名 as 姓名 , 课程 = '总分' , 分数 = 语文 + 数学 + 物理 from tb
) t
order by 姓名 , case 课程 when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 end

drop table tb
chinabdx 2008-12-31
  • 打赏
  • 举报
回复
Create table tb([月] int,[日] int,[编号] nvarchar(2),[名称] nvarchar(7),[数量] int,[单价] int)
Insert tb
select 12,1,N'02',N'冷藏乳制品',13,1 union all
select 12,1,N'03',N'冷冻食品',6,1 union all
select 12,1,N'05',N'常温干货',15,2 union all
select 12,1,N'07',N'熟食',22,7 union all
.
6楼这儿还是要指定类别名称来进行插入呢
lgxyz 2008-12-31
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 chinawwl2008 的回复:]
补冲一下,类别名称不是很确定就知道有多少,有可能多,也有可能少,多的时候可能有上千个,少的时候也得50-60个左右,所以类别名称不可能用一个一个具体去定义,那样太麻烦
[/Quote]

6楼那样写法不行?
chinabdx 2008-12-31
  • 打赏
  • 举报
回复
补冲一下,类别名称不是很确定就知道有多少,有可能多,也有可能少,多的时候可能有上千个,少的时候也得50-60个左右,所以类别名称不可能用一个一个具体去定义,那样太麻烦
chinabdx 2008-12-31
  • 打赏
  • 举报
回复
月份 日期 类别码 类名称 销售 客流
12 1 02 冷藏乳制品 13 1
12 1 03 冷冻食品 6 1
12 1 05 常温干货 15 2
12 2 07 熟食 22 7
12 2 08 非熟食 8 4
12 3 10 海产 3 1
12 3 11 加工 10 1
12 4 12 蔬果 163 26
12 4 13 面包 20 3
12 12 14 家畜 107 6
12 12 20 米面粉类 38 1
--
上面的数字是查询出来的数据,是三个表里面查出来的数据
现在主要是想把查询出来的数据,用类名称当列,日期为行显示数据,而且要注意的是结合三个表是通过语句完不成的,必需将查询出来的结果进行这样显示,觉的不清楚了再问问
gjz_1209 2008-12-31
  • 打赏
  • 举报
回复
典型的行转列的问题,通过程序控制应该更容易实现,PB中的做法:查询语句不变,数据窗口用交叉报表,定义一下行显示的内容及列显示的内容,应该比用SQL语句实现容易一些。

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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