壹佰网|ERP100 - 企业信息化知识门户

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1576|回复: 6

请教大大们一个SQL问题(高手快进啊!!!)

[复制链接]
发表于 2008/12/5 14:10:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。如果您注册时有任何问题请联系客服QQ: 83569622  。

您需要 登录 才可以下载或查看,没有帐号?注册

x

姓名 数学 语文 英语
小华 null 88 null
小明 80 null 69
小张 85 65 70

转换为  
姓名 课程 得分
小张 数学 85
小张 语文 70
小张 英语 65
小明 数学 80
小明 语文 69
小华 英语 88
发表于 2008/12/5 22:56:08 | 显示全部楼层
SELECT 姓名,'数学' AS 课程,数学 AS 得分 FROM TABLE1
UNION
SELECT 姓名,'语文',语文 FROM TABLE1
UNION
SELECT 姓名,'英语',英语 FROM TABLE1
 楼主| 发表于 2008/12/8 13:26:45 | 显示全部楼层
本帖最后由 molwang 于 2008-12-8 13:29 编辑

。。。。。。谢谢了,好久没用SQL,简单的东西也忘了,郁闷。
select 姓名, 课程, 得分
from(SELECT 姓名,'数学' AS 课程,数学 AS 得分 FROM e
UNION
SELECT 姓名,'语文',语文 FROM e
UNION
SELECT 姓名,'英语',英语 FROM e)a
where 得分 is not null and 得分 <>''
发表于 2008/12/8 21:48:33 | 显示全部楼层
这是个很典型的行列转换问题,这个解决方案只适合行列固定及数量较少的情况下,行列转换还有很多好的解决方案,最近有点忙,下次有空整理一下再发上来
发表于 2008/12/10 12:09:49 | 显示全部楼层
如果是SQL 2005
可以採用pivot and unpivot

http://hi.baidu.com/pard/blog/item/d5f5b6458a798226cefca366.html

1.Pivot的用法體會:
語句範例:
select PN,[2006/5/30] as [20060530],[2006/6/2] as [20060602]
from consumptiondata a
Pivot (sum(a.M_qty) FOR a.M_date in ([2006/5/30],[2006/6/2])) as PVT
order by PN
Table結構 Consumptiondata (PN,M_Date,M_qty)
order by PN可要可不要,並不重要,只是排序的作用
關鍵的是紅色部分,解析如下,select 大家都知道,PN是 ConsumptionData表中的一個Column,
[2006/5/30]也是一個Column,他需要顯示成[20060530],注意[2006/5/30]不是一個Value,而是一個Column.[2006/6/2]
與[2006/5/30]一樣.
Pivot ( ........... ) as PVT 這個結構是固定格式,沒有什麼需要特殊說明的,當然PVT隨便你給他一個 NICKNAME ,it
doesn't make any differences.
sum(a.M_qty) 是我們希望顯示出來的值,注意這個地方必須用彙總函數,否則語法不會過.
FOR a.M_date in ([2006/5/30],[2006/6/2])for 表示彙總的值要顯示在哪一個Column下面
如果我們想讓Sum(M_qty)顯示在PN轉換的Column下面,則可寫為For PN, in 的清單表示我們關注哪些要查看的
Column,注意再次強調是Column,不是Value. in的清單是Column清單,不是Value清單,是M_date的Value轉換成的
Column清單.
2.UnPivot

此段可以直接在Sql 2005中執行
CREATE TABLE pvt (VendorID int, Emp1 int, Emp2 int,
Emp3 int, Emp4 int, Emp5 int)
GO
INSERT INTO pvt VALUES (1,4,3,5,4,4)
INSERT INTO pvt VALUES (2,4,1,5,5,5)
INSERT INTO pvt VALUES (3,4,3,5,4,4)
INSERT INTO pvt VALUES (4,4,2,5,5,4)
INSERT INTO pvt VALUES (5,5,1,5,5,5)
GO
select
* from PVT
Unpivot
the table.
SELECT VendorID, Employee, Orders
FROM PVT
UNPIVOT (
Orders FOR Employee IN ([Emp1], [Emp2], [Emp3], [Emp4], [Emp5])
)AS unpvt
GO
說明: Employee以 Column [Emp1]...為值, Orders以Column [Emp1]...的值為值
 楼主| 发表于 2008/12/10 17:11:36 | 显示全部楼层
汗,这个我早看过了,只是没时间去研究,想看实例理解的快些。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|手机版|壹佰网 ERP100 ( 京ICP备19053597号-2 )

Copyright © 2005-2012 北京海之大网络技术有限责任公司 服务器托管由互联互通
手机:13911575376
网站技术点击发送消息给对方83569622   广告&合作 点击发送消息给对方27675401   点击发送消息给对方634043306   咨询及人才点击发送消息给对方138011526

GMT+8, 2025/11/29 06:54 , Processed in 0.016587 second(s), 14 queries , File On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表