大虾们: 
      现在有一个需求统计订单金额 ,订单表分主、次表:
主表 CO_ID,CO_CustomerID,CO_Date...; 
次表: CODetetal_ID,CODetail_ParentID,CODetail_MaterialID,CODetail_Amount....
关联: ON CO_ID = CODetail_ParentIDCO_CustomerID CO_Date CODetail_Amount
   A         2011-1-21     200
   B         2011-1-5     100
   C         2011-1-21    160
   A         2011-2-21     56
   C         2011-1-28    600
   C         2011-2-8     3600
   C         2011-3-8     4360
  ......我想实现按客户年度2011全年月份统计出如下(无记录月份补为0):
  客户 1月   2月   3月  4月 5月 6月 7月 8月 9月 10月 11月 12月 客户合计
  A    200   56     0    ......
  B    100    0     0    ......
  C    760   3600  4360  ......
  .......能用SQL语句一次性统计出来吧 这样效率高。 
请执教了。 

解决方案 »

  1.   


    select custName,
        sum(case when month(date)=1 then amount else 0 end) [1],
        sum(case when month(date)=2 then amount else 0 end) [2],
        ...
        sum(case when month(date)=12 then amount else 0 end) [12],
    from tb
    where year(date)=2011
    group by custName
      

  2.   

    /*
    现在有一个需求统计订单金额 ,订单表分主、次表:
    主表 CO_ID,CO_CustomerID,CO_Date;  
    次表: CODetetal_ID,CODetail_ParentID,CODetail_MaterialID,CODetail_Amount....
    关联: ON CO_ID = CODetail_ParentID
    CO_CustomerID CO_Date CODetail_Amount
       A 2011-1-21 200
       B 2011-1-5 100
       C 2011-1-21 160
       A 2011-2-21 56
       C 2011-1-28 600
       C 2011-2-8 3600
       C 2011-3-8 4360
    我想实现按客户年度2011全年月份统计出如下(无记录月份补为0):
    客户 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 客户合计
       A 200 56 0
       B 100 0 0 
       C 760 3600 4360
    能用SQL语句一次性统计出来吧 这样效率高。  
    请执教了。
    */ go
    if OBJECT_ID('maintbl') is not null
    drop table  maintbl
    go
    create table maintbl(
    CO_ID  varchar(4),
    CO_CustomerID varchar(10),
    CO_Date varchar(8)
    )
    go
    if OBJECT_ID('secondtbl') is not null
    drop table  secondtbl
    go
    create table secondtbl(
    CODetetal_ID varchar(10),
    CODetail_ParentID varchar(10),
    CODetail_MaterialID varchar(10),
    CODetail_Amount int
    )select CO_CustomerID as 客户,
    [1月],[2月],[3月],[4月],[5月],[6月],[7月],[8月],[9月],[10月],[11月],[12月],客户合计
    from(select CO_CustomerID,CO_Date,CODetail_Amount ,
    客户合计=sum(CODetail_Amount)over(partition by CO_CustomerID)
    from maintbl inner join secondtbl b on  CO_ID = CODetail_ParentID)a
    pivot (max(CODetail_Amount) 
    for CO_Date in ([1月],[2月],[3月],[4月],[5月],[6月],
    [7月],[8月],[9月],[10月],[11月],[12月]))b------------------------------------------------------
    --没有插入测试数据进行测试,但查出来结构对了:
    /*
    客户 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 客户合计
    */
      

  3.   


    我这个只是在SQLServer2005和以上版本使用,2000木有pivot这个东西
      

  4.   

    补充一下:
    select CO_CustomerID as 客户,
    [1月],[2月],[3月],[4月],[5月],[6月],[7月],[8月],[9月],[10月],[11月],[12月],客户合计
    from(select CO_CustomerID,CO_Date,CODetail_Amount ,
    客户合计=sum(CODetail_Amount)over(partition by CO_CustomerID)
    from maintbl inner join secondtbl b on CO_ID = CODetail_ParentID)a
    pivot (max(CODetail_Amount) group by 客户
      

  5.   

    select m.CO_CustomerID,
           sum(case when datepart(mm,m.CO_Date) when 1  then n.CODetail_Amount else 0 end) [01月],
           sum(case when datepart(mm,m.CO_Date) when 2  then n.CODetail_Amount else 0 end) [02月],
           sum(case when datepart(mm,m.CO_Date) when 3  then n.CODetail_Amount else 0 end) [03月],
           sum(case when datepart(mm,m.CO_Date) when 4  then n.CODetail_Amount else 0 end) [04月],
           sum(case when datepart(mm,m.CO_Date) when 5  then n.CODetail_Amount else 0 end) [05月],
           sum(case when datepart(mm,m.CO_Date) when 6  then n.CODetail_Amount else 0 end) [06月],
           sum(case when datepart(mm,m.CO_Date) when 7  then n.CODetail_Amount else 0 end) [07月],
           sum(case when datepart(mm,m.CO_Date) when 8  then n.CODetail_Amount else 0 end) [08月],
           sum(case when datepart(mm,m.CO_Date) when 9  then n.CODetail_Amount else 0 end) [09月],
           sum(case when datepart(mm,m.CO_Date) when 10 then n.CODetail_Amount else 0 end) [10月],
           sum(case when datepart(mm,m.CO_Date) when 11 then n.CODetail_Amount else 0 end) [11月],
           sum(case when datepart(mm,m.CO_Date) when 12 then n.CODetail_Amount else 0 end) [12月],
           sum(m.CODetail_Amount) 客户合计
    from 主表 m,次表 n 
    where m.CO_ID = n.CODetail_ParentID and datepart(yy,m.CO_Date) = 2011
    group by m.CO_CustomerIDselect m.CO_CustomerID, datepart(yy,m.CO_Date) yy,
           sum(case when datepart(mm,m.CO_Date) when 1  then n.CODetail_Amount else 0 end) [01月],
           sum(case when datepart(mm,m.CO_Date) when 2  then n.CODetail_Amount else 0 end) [02月],
           sum(case when datepart(mm,m.CO_Date) when 3  then n.CODetail_Amount else 0 end) [03月],
           sum(case when datepart(mm,m.CO_Date) when 4  then n.CODetail_Amount else 0 end) [04月],
           sum(case when datepart(mm,m.CO_Date) when 5  then n.CODetail_Amount else 0 end) [05月],
           sum(case when datepart(mm,m.CO_Date) when 6  then n.CODetail_Amount else 0 end) [06月],
           sum(case when datepart(mm,m.CO_Date) when 7  then n.CODetail_Amount else 0 end) [07月],
           sum(case when datepart(mm,m.CO_Date) when 8  then n.CODetail_Amount else 0 end) [08月],
           sum(case when datepart(mm,m.CO_Date) when 9  then n.CODetail_Amount else 0 end) [09月],
           sum(case when datepart(mm,m.CO_Date) when 10 then n.CODetail_Amount else 0 end) [10月],
           sum(case when datepart(mm,m.CO_Date) when 11 then n.CODetail_Amount else 0 end) [11月],
           sum(case when datepart(mm,m.CO_Date) when 12 then n.CODetail_Amount else 0 end) [12月],
           sum(m.CODetail_Amount) 客户合计
    from 主表 m,次表 n 
    where m.CO_ID = n.CODetail_ParentID
    group by m.CO_CustomerID,datepart(yy,m.CO_Date)
      

  6.   

        sum(case when month(date)=1 then amount else 0 end) [1],
        sum(case when month(date)=2 then amount else 0 end) [2],
        ...
        sum(case when month(date)=12 then amount else 0 end) [12],
    from tb
    where year(date)=2011
    group by custName