Office中国论坛/Access中国论坛

标题: 交叉表在ADP里做不成功 [打印本页]

作者: chenwintek    时间: 2002-3-18 05:43
标题: 交叉表在ADP里做不成功
交叉表在ADP里做不成功,我是直接把MDB里做的交叉表的SQL语句挪过来的,不行,在SQL SERVER里有些什么要注意的吗?[em01][em01]
作者: tmtony    时间: 2002-3-18 05:49
SQL SERVER7.0 是不支持交叉查询语句的
在2000版本我不知道是否可以?
作者: chenwintek    时间: 2002-3-18 05:51
2000里面是可以的,但是帮助看的一头雾水,还没解决。
作者: tmtony    时间: 2002-3-18 05:54
我发现,不光是ACCESS,还有SQL SERVER,我的都是老掉牙啦
作者: chenwintek    时间: 2002-3-18 06:00
镶个金牙,看好看不。
作者: ADGE    时间: 2002-3-19 05:44
可以做,但较麻烦!在《SQL SERVER 7编程技术内幕》这本书有例子我看得不是很明白!
作者: yuab    时间: 2002-7-31 15:31
即然交叉查询在SQL7。0中做不成功,或在SQL2000中不知道是否可以做成功,不过还是有一个地方可以做成功的,那就是将交叉查询的语句放进VBA中一定行,我试过可以。
作者: zhuyiwen    时间: 2002-7-31 18:14
应该是通过Jet引擎实现, SQL 2000同样不支持TRANSFORM...PIVOT语句。也就是说用mdb+链接表,再使用交叉查询,应该可以实现的。

另一法是通过SQL语句现在:

下面,是别人做例子,也许有参考价值:
假定有一个表 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,需要再好好琢磨
写的仓促,也没有测试,呵呵


[em26]
[此贴子已经被zhuyiwen于2002-7-31 10:13:45编辑过]


作者: andy    时间: 2002-9-25 04:37
在SQL2000中交叉表完全可以实现。在SELECT中使用CASE...WHEN...ELSE...END语句。
作者: adge    时间: 2003-5-7 20:45
标题: 举个例子大家讨论一下!!!!!!!!!!!
以下是引用andy在2002-9-24 20:37:01的发言:
在SQL2000中交叉表完全可以实现。在SELECT中使用CASE...WHEN...ELSE...END语句。

能否举个例子大家讨论讨论
作者: thezhehan1    时间: 2003-5-20 00:13
我在ACCESS2000-ADP的存储过程中做了个动态的交叉表,在SQL-SERVER2000的查询分析器中运行正确,但在ACCESS2000-ADP中却只显示了开始的一列!请问有人知道原因吗?





欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3