我需要在数据库中查得结果后按照其它格式在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,向各位请教如何实现。或者还有更好的方法。
有以前的帖子参考也可。

解决方案 »

  1.   

    用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.   

    http://expert.csdn.net/Expert/topic/1873/1873564.xml?temp=.2727167
      

  3.   

    交叉数据报表
    有时候需要旋转结果以便在水平方向显示列,而在垂直方向显示行。这就是所谓的创建 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
      

  4.   

    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 客户
      

  5.   

    各位的方法都很高,算是给小弟我很多启发,但我现在的问题是我的“产品”是不确定的,
    必须到另一表取得“产品”列表方知道有些什么的产品。
    那么象各位的(case when 产品='A' then A end)之类的语句又如何实现呢
      

  6.   

    你可以用动态的sql语句--对了,还没有问,你是什么数据库阿,我指的是平台是sql server
      

  7.   

    不用临时表
    直接用动态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
      

  8.   

    在此非常感谢firetoucher(风焱) 
    但如果考虑到可移植性的话就不太好了,我在为客户写东西的时候习惯用ANSI SQL,免得到时候需要更换数据库
      

  9.   

    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再求和吗就是得到“合计”项
      

  10.   

    创建临时表或者
    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'
      

  11.   

    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 客户