问题的提出:
如何把以下形式
FItemID FName FStockID FDeptID FAuxQty
----------- --------
337 生产部 598 327 1000.0
337 包装车间 624 605 1000.0
339 包装车间 598 605 200.0
. .
. .
. .
转为这个形式
FItemID 生产部 包装车间 FStockID
----------- --------
337 1000 . 598
337 0 1000 . 624
339 0 200 . 598
FItemID FName FStockID FDeptID FAuxQty
----------- --------
337 生产部 598 327 1000.0
337 包装车间 624 605 1000.0
339 包装车间 598 605 200.0
. .
. .
. .
转为这个形式
FItemID 生产部 包装车间 FStockID
----------- --------
337 1000 . 598
337 0 1000 . 624
339 0 200 . 598
从上面我们可以看出,得到的结果就是要实现一个交叉表,要解决以上问题,最简单的方法就是用CASE函数。让我们先来看看CASE函数的释义:
CASE 函数是特殊的 Transact-SQL 表达式,它允许按列值显式可选值。数据中的更改是临时的,没有对数据进行永久更改。例如,CASE 函数可以在 state 列中有 CA 值的行的查询结果集内显示 California。
CASE 函数包含:
CASE 关键字。
需要转换的列名称。
指定要搜索的表达式的 WHEN 子句和指定要替换它们的表达式的 THEN 子句。
END 关键字。
可选的、定义 CASE 函数别名的 AS 子句。
CASE 函数包含:
CASE 关键字。
需要转换的列名称。
指定要搜索的表达式的 WHEN 子句和指定要替换它们的表达式的 THEN 子句。
END 关键字。
可选的、定义 CASE 函数别名的 AS 子句。
由此,我们得出以上问题的解法:
SELECT
FItemID, (
CASE
FName
WHEN
'
生产部
'
THEN
FAuxQty
ELSE
0
END
)
AS
'
生产部
'
,
( CASE FName WHEN ' 包装车间 ' THEN FAuxQty ELSE 0 END ) AS ' 包装车间 ' ,
FStockID, FDeptID
FROM testtable
( CASE FName WHEN ' 包装车间 ' THEN FAuxQty ELSE 0 END ) AS ' 包装车间 ' ,
FStockID, FDeptID
FROM testtable
以上只是个简单的示例,只要我们理解的CASE函数的正确用法,要写出复杂的交叉表,也是轻而易举的事了。
转载请注明作者:cnblogs(Bonny.wong) 2005.1.22