假定有一个表 Pivot,其中每季度占一行。对 Pivot 的 SELECT 操作在垂直方向上列出这些季度:
Year Quarter Amount
---- ------- ------
1990 1 1.1
1990 2 1.2
1990 3 1.3
1990 4 1.4
1991 1 2.1
1991 2 2.2
1991 3 2.3
1991 4 2.4
生成报表的表必须是这样的,其中每年占一行,每个季度的数值显示在一个单独的列中,如:
Year Q1 Q2 Q3 Q4
1990 1.1 1.2 1.3 1.4
1991 2.1 2.2 2.3 2.4
那么用于创建旋转结果的 SELECT 语句
SELECT Year,
SUM(CASE Quarter WHEN 1 THEN Amount ELSE 0 END) AS Q1,
SUM(CASE Quarter WHEN 2 THEN Amount ELSE 0 END) AS Q2,
SUM(CASE Quarter WHEN 3 THEN Amount ELSE 0 END) AS Q3,
SUM(CASE Quarter WHEN 4 THEN Amount ELSE 0 END) AS Q4
FROM Northwind.dbo.Pivot
GROUP BY Year
从中看出,select肯定是可以写的,比如上面例子中的合并成4个季度
你的就是
SELECT id,
SUM(CASE Size WHEN 36 THEN Qty ELSE 0 END) AS size36,
SUM(CASE Size WHEN 38 THEN Qty ELSE 0 END) AS size38,
SUM(CASE Size WHEN 40 THEN Qty ELSE 0 END) AS size40,
SUM(CASE Size WHEN 42 THEN Qty ELSE 0 END) AS size42
......
FROM tablename
GROUP BY id
不过前提是你要知道到底要合并成几列,也就是说到底有多少size
当然,这个也不是那么死的,要不然,就不要我们这些程序员了
可以这样,先查出所有的size,这个是很快的
select size from xxx group by size
接着作循环
当然,是循环拼出那句sql
do while not rs.eof
sql=sql & "SUM(CASE Size WHEN " & cstr(rs(0)) & " THEN Qty ELSE 0 END) AS size" & cstr(rs(0)) & ","
rs.movenext
loop
然后去掉最后一个","拼上头尾,ok!
不过有个需要考虑的,那就是如果一句sql过长,那么有可能堵塞ado,需要再好好琢磨
写的仓促,也没有测试,呵呵
以下是引用andy在2002-9-24 20:37:01的发言:
在SQL2000中交叉表完全可以实现。在SELECT中使用CASE...WHEN...ELSE...END语句。
欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) | Powered by Discuz! X3.3 |