能否不在数据库中建表但实现在DBGrid中显示,既在DataSet中保存¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥

bobit 2003-06-09 06:03:09
我需要在数据库中查得结果后按照其它格式在TDBGrid或TcxGrid中显示,并打印出来
比如我的表结构
主键
________
| |
客户 产品 价格

张三 A 10
张三 B 20
张三 C 50
张三 L 20
李四 ... ...
... ... ...

而我希望他在Grid中这样显示( Name[A..?]可以求出 先假定Name[A..L] )因为它只是查询的临时结果所以不希望在数据库中建表
客户 A B C D E F G H I J K L 合计

张三 10 20 50 0 0 0 0 0 0 0 0 20 100
李四 ... ... ... ... ... ... ... ... .. ... ... ... ...
...

有人告诉我用ClientDataSet可以实现。我是这样设想的先把“客户”这个不变的字段加到ClientDataSet中,再把所有产品名也加入到ClientDataSet的字段列表中,后用一个Query控件求值填入其中,可我却发现这个ClientDataSet不能Active,向各位请教如何实现。或者还有更好的方法。
有以前的帖子参考也可。
...全文
57 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
firetoucher 2003-06-12
  • 打赏
  • 举报
回复
select 客户,
sum(case when 产品 ='A' then A end),
sum(case when 产品 ='B' then B end),
sum(case when 产品 ='C' then C end),
sum(case when 产品 ='D' then D end),
sum(case when 产品 ='E' then E end),
sum(case when 产品 ='F' then F end),
sum(case when 产品 ='G' then G end),
sum(case when 产品 ='H' then H end),
sum(产品) as 合计
from A表 group by 客户
fhuibo 2003-06-12
  • 打赏
  • 举报
回复
创建临时表或者
query.close;
query.clear;
query.sql.add(select table1.id NewId,table1.aa bb,table2.id from table1,table2 where table1.id = table2.id)
open;
dbgrid.columns[0].fieldname := 'NewId'
dbgrid.columns[0].fieldname := 'bb'
bobit 2003-06-12
  • 打赏
  • 举报
回复
select 客户,
sum(case when 产品 ='A' then A end),
sum(case when 产品 ='B' then B end),
sum(case when 产品 ='C' then C end),
sum(case when 产品 ='D' then D end),
sum(case when 产品 ='E' then E end),
sum(case when 产品 ='F' then F end),
sum(case when 产品 ='G' then G end),
sum(case when 产品 ='H' then H end),
from A表 group by 客户

有办法在SQL中把所有SUM再求和吗就是得到“合计”项
firetoucher 2003-06-10
  • 打赏
  • 举报
回复
不用临时表
直接用动态sql
declare @sql varchar(8000)
set @sql = 'select 客户,'

select @sql = @sql + 'sum(case when '''+ 产品+'''
then ' + 产品 +' end) as '''+ 产品+''','
from (select distinct 产品 from mytable) as a

select @sql = left(@sql,len(@sql)-1) + ' from mytable group by 客户'

exec(@sql)
go
inforum 2003-06-10
  • 打赏
  • 举报
回复
借助一个临时表可以做到,偶做过
bobit 2003-06-10
  • 打赏
  • 举报
回复
SQL Server2000
firetoucher 2003-06-10
  • 打赏
  • 举报
回复
你可以用动态的sql语句--对了,还没有问,你是什么数据库阿,我指的是平台是sql server
bobit 2003-06-10
  • 打赏
  • 举报
回复
各位的方法都很高,算是给小弟我很多启发,但我现在的问题是我的“产品”是不确定的,
必须到另一表取得“产品”列表方知道有些什么的产品。
那么象各位的(case when 产品='A' then A end)之类的语句又如何实现呢
zhangqiufk 2003-06-10
  • 打赏
  • 举报
回复
gz
bobit 2003-06-10
  • 打赏
  • 举报
回复
在此非常感谢firetoucher(风焱)
但如果考虑到可移植性的话就不太好了,我在为客户写东西的时候习惯用ANSI SQL,免得到时候需要更换数据库
things 2003-06-09
  • 打赏
  • 举报
回复
up
firetoucher 2003-06-09
  • 打赏
  • 举报
回复
select 客户,
sum(case when 产品 ='A' then A end),
sum(case when 产品 ='B' then B end),
sum(case when 产品 ='C' then C end),
sum(case when 产品 ='D' then D end),
sum(case when 产品 ='E' then E end),
sum(case when 产品 ='F' then F end),
sum(case when 产品 ='G' then G end),
sum(case when 产品 ='H' then H end),
from A表 group by 客户
firetoucher 2003-06-09
  • 打赏
  • 举报
回复
交叉数据报表
有时候需要旋转结果以便在水平方向显示列,而在垂直方向显示行。这就是所谓的创建 PivotTable®、创建交叉数据报表或旋转数据。

假定有一个表 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



下面的语句用于创建 Pivot 表并在其中填入第一个表中的数据:

USE Northwind
GO

CREATE TABLE Pivot
( Year SMALLINT,
Quarter TINYINT,
Amount DECIMAL(2,1) )
GO
INSERT INTO Pivot VALUES (1990, 1, 1.1)
INSERT INTO Pivot VALUES (1990, 2, 1.2)
INSERT INTO Pivot VALUES (1990, 3, 1.3)
INSERT INTO Pivot VALUES (1990, 4, 1.4)
INSERT INTO Pivot VALUES (1991, 1, 2.1)
INSERT INTO Pivot VALUES (1991, 2, 2.2)
INSERT INTO Pivot VALUES (1991, 3, 2.3)
INSERT INTO Pivot VALUES (1991, 4, 2.4)
GO

下面是用于创建旋转结果的 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
GO
newsofter 2003-06-09
  • 打赏
  • 举报
回复
up
「已注销」 2003-06-09
  • 打赏
  • 举报
回复
建立临时表,你不用管它的删除,在用后会自动删除
tw_cshn 2003-06-09
  • 打赏
  • 举报
回复
http://expert.csdn.net/Expert/topic/1873/1873564.xml?temp=.2727167
chechy 2003-06-09
  • 打赏
  • 举报
回复
用ClientDataSet可以创建一个完全的虚表,下面是Delphi的例子。
procedure TForm1.FormCreate(Sender: TObject);
begin
with ClientDataSet1 do
begin
with FieldDefs.AddFieldDef do
begin
DataType := ftInteger;
Name := 'Field1';
end;
with FieldDefs.AddFieldDef do
begin
DataType := ftString;
Size := 10;
Name := 'Field2';
end;
with IndexDefs.AddIndexDef do

begin
Fields := 'Field1';
Name := 'IntIndex';
end;
CreateDataSet;
end;
end;

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧