我需要在数据库中查得结果后按照其它格式在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,向各位请教如何实现。或者还有更好的方法。
有以前的帖子参考也可。
比如我的表结构
主键
________
| |
客户 产品 价格张三 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,向各位请教如何实现。或者还有更好的方法。
有以前的帖子参考也可。
解决方案 »
- 两段几乎相同的代码,pascal代码运行后成功更改了资源句柄, c++代码却不行,不得其解?
- 产生注册号及相对应的注册系统代码
- 数据库连接的问题
- 在delphi 中实现对sql server的数据备份
- 如何从outlook中导入地址簿的数据
- 小妹有一个问题,请大虾们帮着看看
- 如何在程序动行时改变 Adodataset的locktype。
- 50分奉上,如何将DLL中的form融合到主窗体的panel中
- 内嵌窗口的问题
- 太遗憾了!
- 紧急求救(在线等):Error reading Image1.Picture.Data:Bitmap image is not valid.
- 关于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;
有时候需要旋转结果以便在水平方向显示列,而在垂直方向显示行。这就是所谓的创建 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
GOCREATE 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
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 客户
必须到另一表取得“产品”列表方知道有些什么的产品。
那么象各位的(case when 产品='A' then A end)之类的语句又如何实现呢
直接用动态sql
declare @sql varchar(8000)
set @sql = 'select 客户,'select @sql = @sql + 'sum(case when '''+ 产品+'''
then ' + 产品 +' end) as '''+ 产品+''','
from (select distinct 产品 from mytable) as aselect @sql = left(@sql,len(@sql)-1) + ' from mytable group by 客户'exec(@sql)
go
但如果考虑到可移植性的话就不太好了,我在为客户写东西的时候习惯用ANSI SQL,免得到时候需要更换数据库
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再求和吗就是得到“合计”项
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'
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 客户