大概例子如下:
    表1:TableHead
         字段:
              PID 内码
              PCustomer 客户
              ...等字段
         数据大概如下:
             PID       PCustomer     ...
              1          张三
              2          张三
   表2:TableBody1
        字段:
             PID 内码 与TableHead关联
             PEntryID    分录序号
             PBillNumber 单据号
             PDate       日期
             PGoods      商品种类
             PQty        数量
             PAmount     金额
         数据大概如下:
             PID      PEntryID      FBillNumber      PDate       PGoods      FQty    PAmount
              1          1          A类单据0001     2009-08-09      商品1       100     1000
              1          2          A类单据0001     2009-08-09      商品2       50       800
              1          3          A类单据0002     2009-08-10      商品3       60       600
              2          1          A类单据0003     2009-08-11      商品1       70       800
              2          2          A类单据0003     2009-08-11      商品3       10       50   表3:TableBody2
        字段:
             PID 内码 与TableHead关联
             PEntryID    分录序号
             PBillNumber 单据号
             PDate       日期
             PGoods      商品种类
             PQty        数量
             PAmount     金额
         数据大概如下:
             PID      PEntryID      FBillNumber      PDate       PGoods      FQty    PAmount
              1          1          B类单据0001     2009-08-09      商品1       10     100
              1          2          B类单据0001     2009-08-09      商品2       20       200
              1          3          B类单据0002     2009-08-10      商品3       30       300
              1          4          B类单据0002     2009-08-10      商品4       40       400
              2          1          B类单据0003     2009-08-11      商品2       70       800 表4:TableBody3
        字段:
             PID 内码 与TableHead关联
             PEntryID    分录序号
             PBillNumber 单据号
             PDate       日期
             PGoods      商品种类
             PQty        数量
             PAmount     金额
         数据大概如下:
             PID      PEntryID      FBillNumber      PDate       PGoods      FQty    PAmount
              1          1          C类单据0001     2009-08-09      商品1       10     100
              1          2          C类单据0001     2009-08-09      商品3      20       200
              2          1          C类单据0003     2009-08-11      商品4       70       800以上为基础表
想通过这些基础表形成以下的报表形式
PCustomer  PGoods  A类单据号   日期   数量  金额  B类单据号  日期  数量 金额   C类单据号  日期  数量 金额
   张三     商品1  A类单据0001   .....            B类单据0001 .....            C类单据0001  ..... 
                   A类单据0003   .....
   张三     商品2  A类单据0001   .....            B类单据0001 .....         
                                                  B类单据0003 .....        
   张三     商品3  A类单据0002   .....            B类单据0002                  C类单据0001 .....
                   A类单据0003   .....       
   张三     商品4                                 B类单据0002 .....            C类单据0003 .....

解决方案 »

  1.   

    求求各位大哥帮小弟想想SQL语句
      

  2.   

    select t1.PCustomer,
           t2.PGoods , t2.FBillNumber , t2.PDate , t2.FQty , t2.je,
           t3.PGoods , t3.FBillNumber , t3.PDate , t3.FQty , t3.je,
           t4.PGoods , t4.FBillNumber , t4.PDate , t4.FQty , t4.je
    from TableHead t1
    left join (select PGoods , FBillNumber , PDate , sum(FQty) FQty, sum(FQty * PAmount) je from TableBody1 group by PGoods , FBillNumber , PDate) t2 on t1.PID = t2.PID
    left join (select PGoods , FBillNumber , PDate , sum(FQty) FQty, sum(FQty * PAmount) je from TableBody2 group by PGoods , FBillNumber , PDate) t3 on t1.PID = t3.PID
    left join (select PGoods , FBillNumber , PDate , sum(FQty) FQty, sum(FQty * PAmount) je from TableBody3 group by PGoods , FBillNumber , PDate) t4 on t1.PID = t4.PID
      

  3.   

    left join+行列转换 太长了 哎
      

  4.   

    select distinct ...... from .....去重复行不!
      

  5.   

    /*准备测试数据*/
    if object_id('[TableHead]') is not null drop table [TableHead] 
    go 
    create table [TableHead]([PID] int,[PCustomer] varchar(50)) 
    insert [TableHead] 
    select 1,'张三' union all 
    select 2,'李四'-- 
    if object_id('[TableBody1]') is not null drop table [TableBody1] 
    go 
    create table [TableBody1]([PID] int,[PEntryID] int,FBillNumber varchar(50), PDate datetime,PGoods varchar(50),FQty int ,PAmount int) 
    insert [TableBody1] 
    select 1,1,'A类单据0001','2009-08-09','商品1',100,1000 union all 
    select 1,2,'A类单据0001','2009-08-09','商品2',50 , 800 union all 
    select 1,3,'A类单据0002','2009-08-10','商品3',60 , 600 union all 
    select 2,1,'A类单据0003','2009-08-11','商品1',70 , 800 union all 
    select 2,2,'A类单据0003','2009-08-11','商品3',10 , 50  
    -- 
    if object_id('[TableBody2]') is not null drop table [TableBody2] 
    go 
    create table [TableBody2]([PID] int,[PEntryID] int,FBillNumber varchar(50), PDate datetime,PGoods varchar(50),FQty int ,PAmount int) 
    insert [TableBody2] 
    select 1,1,'B类单据0001','2009-08-09','商品1',10 , 100 union all 
    select 1,2,'B类单据0001','2009-08-09','商品2',20 , 200 union all 
    select 1,3,'B类单据0002','2009-08-10','商品3',30 , 300 union all 
    select 1,4,'B类单据0002','2009-08-10','商品4',40 , 400 union all 
    select 2,1,'B类单据0003','2009-08-11','商品2',70 , 800  
    -- 
    if object_id('[TableBody3]') is not null drop table [TableBody3] 
    go 
    create table [TableBody3]([PID] int,[PEntryID] int,FBillNumber varchar(50), PDate datetime,PGoods varchar(50),FQty int ,PAmount int) 
    insert [TableBody3] 
    select 1,1,'C类单据0001','2009-08-09','商品1',10 , 100 union all 
    select 1,2,'C类单据0001','2009-08-09','商品3',20 , 200 union all 
    select 2,1,'C类单据0003','2009-08-11','商品4',70 , 800  
    -- 
    /*查询*/
    -- 左连接串
    --select * from ( select a.PID,a.PCustomer, b.PGoods from TableHead a left join 
    --(select distinct PID,PGoods from (select distinct PID,PGoods from TableBody1 union all
    --select distinct PID,PGoods from TableBody2 union all
    --select distinct PID,PGoods from TableBody3 ) c )b on a.PID=b.PID ) t1 order by t1.PID ,t1.PGoodsselect t1.PCustomer,
           t2.PGoods , t2.FBillNumber , t2.PDate , t2.FQty , t2.je,
           t3.PGoods , t3.FBillNumber , t3.PDate , t3.FQty , t3.je,
           t4.PGoods , t4.FBillNumber , t4.PDate , t4.FQty , t4.je
    from ( select a.PID,a.PCustomer, b.PGoods from TableHead a left join 
    (select distinct PID,PGoods from (select distinct PID,PGoods from TableBody1 union all
    select distinct PID,PGoods from TableBody2 union all
    select distinct PID,PGoods from TableBody3 ) c )b on a.PID=b.PID ) t1 
    full join (select PID,PGoods , FBillNumber , PDate , sum(FQty) FQty, sum(FQty * PAmount) je from TableBody1 group by PID,PGoods , FBillNumber , PDate) t2 on t1.PID = t2.PID and t1.PGoods=t2.PGoods
    full join (select PID,PGoods , FBillNumber , PDate , sum(FQty) FQty, sum(FQty * PAmount) je from TableBody2 group by PID,PGoods , FBillNumber , PDate) t3 on t1.PID = t3.PID and t1.PGoods=t3.PGoods
    full join (select PID,PGoods , FBillNumber , PDate , sum(FQty) FQty, sum(FQty * PAmount) je from TableBody3 group by PID,PGoods , FBillNumber , PDate) t4 on t1.PID = t4.PID and t1.PGoods=t4.PGoods
    /*执行结果*/
    张三 商品1 A类单据0001 2009-08-09 00:00:00.000 100 100000 商品1 B类单据0001 2009-08-09 00:00:00.000 10 1000 商品1 C类单据0001 2009-08-09 00:00:00.000 10 1000
    张三 商品2 A类单据0001 2009-08-09 00:00:00.000 50 40000 商品2 B类单据0001 2009-08-09 00:00:00.000 20 4000 NULL NULL NULL NULL NULL
    张三 商品3 A类单据0002 2009-08-10 00:00:00.000 60 36000 商品3 B类单据0002 2009-08-10 00:00:00.000 30 9000 商品3 C类单据0001 2009-08-09 00:00:00.000 20 4000
    张三 NULL NULL NULL NULL NULL 商品4 B类单据0002 2009-08-10 00:00:00.000 40 16000 NULL NULL NULL NULL NULL
    李四 商品1 A类单据0003 2009-08-11 00:00:00.000 70 56000 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
    李四 NULL NULL NULL NULL NULL 商品2 B类单据0003 2009-08-11 00:00:00.000 70 56000 NULL NULL NULL NULL NULL
    李四 商品3 A类单据0003 2009-08-11 00:00:00.000 10 500 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
    李四 NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL 商品4 C类单据0003 2009-08-11 00:00:00.000 70 56000
      

  6.   

    ----悲哀:这样设计合理吗?
    ----没有一个 PGoods      商品种类  关联的表吗?
    ----所有的商品应该有个“商品信息表才对的啊?----不然:报表多了,都要先去distinct再去联结, 多麻烦啊?
      

  7.   

    我只是一个例子,商品都是用内码的!还有tablehead的客户会有重复性!业务逻辑大概是这样的,有一个tablehead记录是客户的相关信息,最重要是这里会记录一种单据!然后tablebody1,tablebody2,tablebody3关联或者下推而来,随着业务的扩展可能tablbody表可能会不断的增加!通过一段时间相同客户不同商品,各种明细单据的报表!其实还有其他功能的例如客户上级会有代理,区域,国家等还要把客户group by出来!还有具体的每个单据的账龄显示