数据集能不能在Sql语句中当表名使用?

terry_tj 2005-09-25 11:38:55
从:
adoquery1.close;
adoquery1.sql.text:='select 项目ID,项目名称, 月分, 月金额合计 from 项目月统计表';
adoquery1.open;
得数据集如下:
项目ID,项目名称, 月分, 月金额合计
---------------------------------
1, 饼干, 一月, 200
2, 月饼, 一月, 40
3, 可乐, 一月, 450
4, 篮球, 一月, 2000
5, 汽车, 一月, 1000

1, 饼干, 二月, 1200
2, 月饼, 二月, 140
3, 可乐, 二月, 1450
4, 篮球, 二月, 12000
5, 汽车, 二月, 11000
....

我希望通过以下Sql语句变换上面的数据集,以上的数据集,以下简称A^:

Select 项目ID,项目名称 from A^ left outer join
(Select 月金额合计 as 一月金额 from A^ where 月份='一月') as 一月表
on A^.项目ID=一月表.项目ID
Left outer join
(Select 月金额合计 as 二月金额 from A^ where 月份='二月') as 二月表
on A^.项目ID=二月表.项目ID
..........

变换后的数据集如下

项目ID,项目名称, 一月份,二月份 , ....
-----------------------------------
1, 饼干, 200, 1200 , ....
2, 月饼, 40, 140 , ....
3, 可乐, 450, 1450, ....
4, 篮球, 2000, 12000, ....
5, 汽车, 1000, 11000, ....

问题:

我怎么才能得到A^,这个A^在我的Sql语句用什么代替?
以前想的几个方法,都被否定:如 把'select 项目ID,项目名称, 月分, 月金额合计 from 项目月统计表'这个数据集写入基础表,就可以得到一个具体

的A^表,但想到是多用户操作,不妥.写入全局临时表类似; 我希望通过建立临时表来代替A^,但A^又不能在delphi中用,因为一个会话完了A^就不存在了.高手救救我吧.

...全文
101 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
todouwang 2005-09-26
做成服务端的存储过程,
回复
swei56 2005-09-25
1、你要是得到这个数据集,那么嵌套你的sql语句可以达到你的目的;
2、如果只是做报表用,用交叉报表就更简单点。
回复
jinjazz 2005-09-25
--建立测试环境
Create Table 表(项目ID varchar(10),项目名称 varchar(10),月分 varchar(10),月金额合计 integer)
--插入数据
insert into 表
select '1','饼干','一月','200' union
select '2','月饼','一月','40' union
select '3','可乐','一月','450' union
select '4','篮球','一月','2000' union
select '5','汽车','一月','1000' union
select '1','饼干','二月','1200' union
select '2','月饼','二月','140' union
select '3','可乐','二月','1450' union
select '4','篮球','二月','12000' union
select '5','汽车','二月','11000'

--测试语句
DECLARE @SQL VARCHAR(8000)
SET @SQL='SELECT 项目ID,项目名称'
SELECT @SQL= @SQL+ ',sum(CASE WHEN 月分 = ''' + 月分 + ''' THEN 月金额合计 END) [' + 月分 + ']' FROM (SELECT DISTINCT 月分 FROM 表) A
SET @SQL=@SQL+' FROM 表 GROUP BY 项目ID,项目名称'
EXEC (@SQL)

--删除测试环境
Drop Table 表


/*------- 测试结果
项目ID 项目名称 二月 一月
---------- ---------- ----------- -----------
1 饼干 1200 200
3 可乐 1450 450
4 篮球 12000 2000
5 汽车 11000 1000
2 月饼 140 40
----------*/
回复
jinjazz 2005-09-25
动态的Case when是行变列的最好方法.你动动手打开你的sql查询分析器.运行上边的演示就明白了,里面不存在视图或者临时表.

另外说一句:你的视图速度慢一般都是因为多重嵌套的原因,你应该把你的所有sql放在一个查询中处理,视图是给最终的用户用的,不要在你的设计期过多依赖其它的视图
回复
jinjazz 2005-09-25
视图只是几个sql语句和速度有必然的联系么?
select * from ...也可以是视图

回复
terry_tj 2005-09-25
to:hqhhh(枫叶)
to: digestion(乱了)

但你们都乎视了一个问题,就是速度的问题,
我做过测试,如果用基础表作为变换数据集的"原始表" 比视图作为变换数据集的"原始表"要快得多,特别是"原始表"数据量很大的时候, 也就是我为什么一直不采用视图的原因.
其实我提出的问题是不难解决的,但要考虑到速度.不可能让你的客户用我们的软件的时候等上30秒到一分多钟吧.
Sqlserver的视图很好用,但速度问题不敢恭维
回复
hqhhh 2005-09-25
jinjazz(近身剪(充电中...)) 正楼,
楼主误解,jinjazz只是做个演示数据,
其实你不需要做创建表,
只做写下面的查询即可!

DECLARE @SQL VARCHAR(8000)
SET @SQL='SELECT 项目ID,项目名称'
SELECT @SQL= @SQL+ ',sum(CASE WHEN 月分 = ''' + 月分 + ''' THEN 月金额合计 END) [' + 月分 + ']' FROM (SELECT DISTINCT 月分 FROM 表) A
SET @SQL=@SQL+' FROM 表 GROUP BY 项目ID,项目名称'
EXEC (@SQL)
回复
Jasonli8205 2005-09-25
楼上正解,不过不是把数据集名当成表名来用!而是嵌套SQL语句!不过这个嵌套SQL在SQLServer中好像不行?望高手指教!
回复
digestion 2005-09-25
数据集本来就可以当成一个临时表来引用,在SQL语句中直接写就行,如:

select 项目,sum(金额) as TM from (Select 项目,金额,时间 from 基础表) A group by 项目



回复
terry_tj 2005-09-25
to: jinjazz(近身剪(充电中...))
虽然您的解决方法可以解决我的问题,但也引发另外一个问题,多用户操作这个表,即(Create Table 表(项目ID varchar(10),项目名称 varchar(10),月分 varchar(10),月金额合计 integer)
)的时候,可以会出现问题,因为会很多用户都这Create这个表,又在删除这个表,速度可能比较慢,数据上可能有错,最理想的方法是把这个表变成临时表,SqlServer为每个用户建立一个会话,每个用户各自出来自己的会话,最后,sqlserver自己删除这个临时表.
-------
个人想发:
Delphi是不是可以做得更好.
TClientDateSet可以保持从数据库中下载的数据集,根据需要,我们常要对这个 TClientDateSet 中的数据集再一部加工,也就是把TClientDateSet当着Sql语句中的一个表来使用,岂不是更好?
直接写Sql语句.
如:我模拟一下:
ClientDateSet1.close;
ClientDataSet1.CommandText:='Select 项目,金额,时间 from 基础表';
ClientDataSet1.Open;

把 ClientDataSet1 当成一 个表 ClientDataSet1, 再对ClientDataSet1做处理;
adoquery1.close;
adoquery1.sql.text:='Select 项目,sum(金额) as TM from ClientDataSet1 group by 项目';
adoquery1.Open;
我就可以得到变换后的数据集adoquery1了.



回复
相关推荐
发帖
数据库相关
创建于2007-08-02

2454

社区成员

Delphi 数据库相关
申请成为版主
帖子事件
创建了帖子
2005-09-25 11:38
社区公告
暂无公告