正在学习sql,新手,向前辈们学习请教,
刚工作没多久,因为在单位使用ERP软件的缘故,用的sql2000数据库,查询分析器会一些简单查询。
公司是商品流通行业,做小家电销售。
有时候很无聊,反正按照ERP软件作……
想做一些业务的进阶分析,可能的话,自己也多学些。嗯,反正觉得职场路不好走……
比如现在考虑作几张报表,向前辈们请教了,谢谢!想做销售分析报表,通过这样的方式系统学习sql
一种方式是按客户排名
例:
排名  客户名称  年度1月份 2月份  3月份 4月份 5月份 6月份 7月份  8月份  9月份  10月份  11月份 12月份  总计   比率
1     a公司   2009 100万 100万 100万 100万 100万 100万 100万 100万  100万  100万   100万  100万  1200万  56%
2     b公司   2009 80万  80万  80万  80万  80万   80万  80万  80万   80万   80万    80万    80万   960万   44%
……
……
说明:1、排名是按照数据库里销货明细表(XHD)按客户查询的汇总值,当前时间a公司汇总值最高,就排名第一
      2、每月销货明细表(XHD)汇总
      3、要有所有月份的总计和每个客户所占销售额的比率
      4、要有年度区分
      5、我想销货明细表(XHD)关键字段为客户名称、销货日期、金额
      6、希望前辈们就语句阐述下思路多谢!

解决方案 »

  1.   

    谢谢2楼的前辈,
    不知道我这样说的对不对,
    比如,公司ERP数据库名YMGM,
    销货明细单在数据库里有两张表,
    一张是销货单单头档JSKKEA,关键字段编号为KEA001单号、KEA003日期、KEA004客户
    另一张是销货单单身档JSKKEB,关键字段编号为KEB001单号、KEB031本币价税合计
    其中KEA001单号和KEB001单号是对应的
    例:
    JSKKEA表
    KEA001(单号) KEA003(日期)    KEA004(客户)
    20081230001   20081230         客户a
    20081230002   20081230         客户b
    20090101001   20090101         客户a
    20090102001   20090102         客户b
    20090103001   20090103         客户a
    20090104001   20090104         客户b
    20090201001   20090201         客户a
    20090202001   20090202         客户bJSKKEB表
    KEB001(单号) KEA031(本币税价合计)         
    20081230001   100万
    20081230002   50万
    20090101001   100万
    20090102001   100万
    20090103001   50万
    20090104001   100万
    20090201001   50万
    20090202001   100万可以看出2008年12月份 客户a销售额为100万,客户b销售额为50万;客户a2008年度销售额大于客户b2008年度销售额;客户a所占2008年度销售总额为67%,客户b所占2008年度销售总额为33%;
    2009年1月份客户b销售额为200万,2月份为100万;2009年1月份客户a销售额为150万,2月份为50万;客户b2009年度销售额大于客户a2009年度销售额;客户b所占2009年度销售总额为60%,客户a所占2009年度销售总额为40%;我想要在这两张表得出的结果如下:
    排名   客户名称   年度  1月份     2月份   3月份 4月份 5月份 6月份 7月份  8月份  9月份  10月份  11月份 12月份  总计   比率 
     1      客户a    2008                                                                        100万   100万  67%
     2     客户b    2008                                                                        50万    50万   33%
     1     客户b   2009  200万      100万                                                                        300万  60%
     2     客户a   2009  150万      50万                                                                         200万  40%
      

  2.   

    可以参照:/*
    标题:普通行列转换(version 2.0)
    作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
    时间:2008-03-09
    地点:广东深圳
    说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。问题:假设有张学生成绩表(tb)如下:
    姓名 课程 分数
    张三 语文 74
    张三 数学 83
    张三 物理 93
    李四 语文 74
    李四 数学 84
    李四 物理 94
    想变成(得到如下结果): 
    姓名 语文 数学 物理 
    ---- ---- ---- ----
    李四 74   84   94
    张三 74   83   93
    -------------------
    */create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
    insert into tb values('张三' , '语文' , 74)
    insert into tb values('张三' , '数学' , 83)
    insert into tb values('张三' , '物理' , 93)
    insert into tb values('李四' , '语文' , 74)
    insert into tb values('李四' , '数学' , 84)
    insert into tb values('李四' , '物理' , 94)
    go--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
    select 姓名 as 姓名 ,
      max(case 课程 when '语文' then 分数 else 0 end) 语文,
      max(case 课程 when '数学' then 分数 else 0 end) 数学,
      max(case 课程 when '物理' then 分数 else 0 end) 物理
    from tb
    group by 姓名--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
    declare @sql varchar(8000)
    set @sql = 'select 姓名 '
    select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
    from (select distinct 课程 from tb) as a
    set @sql = @sql + ' from tb group by 姓名'
    exec(@sql) --SQL SERVER 2005 静态SQL。
    select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b--SQL SERVER 2005 动态SQL。
    declare @sql varchar(8000)
    select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
    set @sql = '[' + @sql + ']'
    exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')---------------------------------/*
    问题:在上述结果的基础上加平均分,总分,得到如下结果:
    姓名 语文 数学 物理 平均分 总分 
    ---- ---- ---- ---- ------ ----
    李四 74   84   94   84.00  252
    张三 74   83   93   83.33  250
    */--SQL SERVER 2000 静态SQL。
    select 姓名 姓名,
      max(case 课程 when '语文' then 分数 else 0 end) 语文,
      max(case 课程 when '数学' then 分数 else 0 end) 数学,
      max(case 课程 when '物理' then 分数 else 0 end) 物理,
      cast(avg(分数*1.0) as decimal(18,2)) 平均分,
      sum(分数) 总分
    from tb
    group by 姓名--SQL SERVER 2000 动态SQL。
    declare @sql varchar(8000)
    set @sql = 'select 姓名 '
    select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
    from (select distinct 课程 from tb) as a
    set @sql = @sql + ' , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名'
    exec(@sql) --SQL SERVER 2005 静态SQL。
    select m.* , n.平均分 , n.总分 from
    (select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b) m,
    (select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
    where m.姓名 = n.姓名--SQL SERVER 2005 动态SQL。
    declare @sql varchar(8000)
    select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
    exec ('select m.* , n.平均分 , n.总分 from
    (select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b) m , 
    (select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
    where m.姓名 = n.姓名')drop table tb    ------------------
      

  3.   

    -------------------------------------------
    --  Author : liangCK 小梁 & angellan 兰儿
    --  Comment: 小梁 爱 兰儿
    --  Date   : 2009-06-03 09:24:11
    -------------------------------------------
     
    --> 生成测试数据: [JSKKEA]
    IF OBJECT_ID('[JSKKEA]') IS NOT NULL DROP TABLE [JSKKEA]
    CREATE TABLE [JSKKEA] (KEA001 BIGINT,KEA003 DATETIME,KEA004 VARCHAR(5))
    INSERT INTO [JSKKEA]
    SELECT 20081230001,'20081230','客户a' UNION ALL
    SELECT 20081230002,'20081230','客户b' UNION ALL
    SELECT 20090101001,'20090101','客户a' UNION ALL
    SELECT 20090102001,'20090102','客户b' UNION ALL
    SELECT 20090103001,'20090103','客户a' UNION ALL
    SELECT 20090104001,'20090104','客户b' UNION ALL
    SELECT 20090201001,'20090201','客户a' UNION ALL
    SELECT 20090202001,'20090202','客户b'
     
    --> 生成测试数据: [JSKKEB]
    IF OBJECT_ID('[JSKKEB]') IS NOT NULL DROP TABLE [JSKKEB]
    CREATE TABLE [JSKKEB] (KEB001 BIGINT,KEA031 VARCHAR(5))
    INSERT INTO [JSKKEB]
    SELECT 20081230001,'100万' UNION ALL
    SELECT 20081230002,'50万' UNION ALL
    SELECT 20090101001,'100万' UNION ALL
    SELECT 20090102001,'100万' UNION ALL
    SELECT 20090103001,'50万' UNION ALL
    SELECT 20090104001,'100万' UNION ALL
    SELECT 20090201001,'50万' UNION ALL
    SELECT 20090202001,'100万'--SQL查询如下:SELECT
        A.KEA004 AS 客户名称,
        YEAR(A.KEA003) AS 年度,
        SUM(CASE WHEN MONTH(KEA003) = 1
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [1月份],
        SUM(CASE WHEN MONTH(KEA003) = 2
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [2月份],
        SUM(CASE WHEN MONTH(KEA003) = 3
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [3月份],
        SUM(CASE WHEN MONTH(KEA003) = 4
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [4月份],
        SUM(CASE WHEN MONTH(KEA003) = 5
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [5月份],
        SUM(CASE WHEN MONTH(KEA003) = 6
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [6月份],
        SUM(CASE WHEN MONTH(KEA003) = 7
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [7月份],
        SUM(CASE WHEN MONTH(KEA003) = 8
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [8月份],
        SUM(CASE WHEN MONTH(KEA003) = 9
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [9月份],
        SUM(CASE WHEN MONTH(KEA003) = 10
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [10月份],
        SUM(CASE WHEN MONTH(KEA003) = 11
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [11月份],
        SUM(CASE WHEN MONTH(KEA003) = 12
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [12月份],
        SUM(CAST(LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1) AS NUMERIC(20,4))) AS [总计]
    FROM [JSKKEA] AS A
        JOIN [JSKKEB] AS B
    ON A.KEA001 = B.KEB001
    GROUP BY A.KEA004,YEAR(A.KEA003);--删除测试
    DROP TABLE [JSKKEA],[JSKKEB]/*
    客户名称  年度          1月份         2月份         3月份         4月份         5月份         6月份         7月份         8月份         9月份         10月份        11月份        12月份        总计
    ----- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ---------------------------------------
    客户a   2008        0           0           0           0           0           0           0           0           0           0           0           100         100.0000
    客户a   2009        150         50          0           0           0           0           0           0           0           0           0           0           200.0000
    客户b   2008        0           0           0           0           0           0           0           0           0           0           0           50          50.0000
    客户b   2009        200         100         0           0           0           0           0           0           0           0           0           0           300.0000(4 row(s) affected)*/
      

  4.   


    create table JSKKEA(KEA001 varchar(20), KEA003 varchar(20),    KEA004 varchar(20))
    insert into JSKKEA
    select '20081230001',  '20081230',        '客户a'  union all
    select '20081230002',  '20081230',        '客户b'  union all 
    select '20090101001',  '20090101',        '客户a'  union all 
    select '20090102001',  '20090102',        '客户b'  union all 
    select '20090103001',  '20090103',        '客户a'  union all 
    select '20090104001',  '20090104',        '客户b'  union all 
    select '20090201001',  '20090201',        '客户a'  union all 
    select '20090202001',  '20090202',        '客户b' create table JSKKEB(KEB001 varchar(20), KEA031 varchar(20))
    insert into  JSKKEB       
    select '20081230001',  '100万'  union all 
    select '20081230002',  '50万'   union all
    select '20090101001',  '100万'   union all
    select '20090102001',  '100万'   union all
    select '20090103001',  '50万'  union all 
    select '20090104001',  '100万'  union all 
    select '20090201001',  '50万'  union all
    select '20090202001',  '100万' select  KEA004 as 客户名称,
            datepart(year,cast(KEA003 as datetime)) as 年份,
    [1月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=1 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',  
    [2月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=2 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',    
    [3月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=3 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',  
    [4月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=4 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万', 
    [5月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=5 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',  
    [6月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=6 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',  
    [7月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=7 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',   
    [8月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=8 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',   
    [9月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=9 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',   
    [10月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=10 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',   
    [11月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=11 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',  
    [12月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=12 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',   
    总计  = cast(sum(cast(replace(b.KEA031,'万','') as int)) as varchar(20))+'万',
    比率 = replace(cast(sum(cast(replace(b.KEA031,'万','') as int))*1.0/(select sum(cast(replace(KEA031,'万','') as int)) from JSKKEB where KEB001 in(select KEA001 from JSKKEA where datepart(year,cast(KEA003 as datetime))= datepart(year,cast(a.KEA003 as datetime)))) as decimal(18,2))*100,'.00','%')
    from JSKKEA a ,JSKKEB b 
    where a.KEA001 = b.KEB001 
    group by KEA004,datepart(year,cast(KEA003 as datetime))
    order by 年份,客户名称drop table JSKKEA,JSKKEB
    /*
    客户a 2008 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 100万 100万 67%
    客户b 2008 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 50万 50万 33%
    客户a 2009 150万 50万 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 200万 40%
    客户b 2009 200万 100万 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 300万 60%
    */
      

  5.   


    create table JSKKEA(KEA001 varchar(20), KEA003 varchar(20),    KEA004 varchar(20))
    insert into JSKKEA
    select '20081230001',  '20081230',        '客户a'  union all
    select '20081230002',  '20081230',        '客户b'  union all 
    select '20090101001',  '20090101',        '客户a'  union all 
    select '20090102001',  '20090102',        '客户b'  union all 
    select '20090103001',  '20090103',        '客户a'  union all 
    select '20090104001',  '20090104',        '客户b'  union all 
    select '20090201001',  '20090201',        '客户a'  union all 
    select '20090202001',  '20090202',        '客户b' create table JSKKEB(KEB001 varchar(20), KEA031 varchar(20))
    insert into  JSKKEB       
    select '20081230001',  '100万'  union all 
    select '20081230002',  '50万'   union all
    select '20090101001',  '100万'   union all
    select '20090102001',  '100万'   union all
    select '20090103001',  '50万'  union all 
    select '20090104001',  '100万'  union all 
    select '20090201001',  '50万'  union all
    select '20090202001',  '100万' select 排名= row_number() over(partition by 年份 order by 比率 desc),*
    from
    (
    select  KEA004 as 客户名称,
            datepart(year,cast(KEA003 as datetime)) as 年份,
    [1月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=1 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',  
    [2月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=2 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',    
    [3月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=3 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',  
    [4月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=4 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万', 
    [5月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=5 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',  
    [6月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=6 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',  
    [7月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=7 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',   
    [8月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=8 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',   
    [9月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=9 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',   
    [10月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=10 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',   
    [11月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=11 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',  
    [12月份] = cast(sum(case when datepart(month,cast(KEA003 as datetime))=12 then cast(replace(b.KEA031,'万','') as int) else 0 end) as varchar(20))+'万',   
    总计  = cast(sum(cast(replace(b.KEA031,'万','') as int)) as varchar(20))+'万',
    比率 = replace(cast(sum(cast(replace(b.KEA031,'万','') as int))*1.0/(select sum(cast(replace(KEA031,'万','') as int)) from JSKKEB where KEB001 in(select KEA001 from JSKKEA where datepart(year,cast(KEA003 as datetime))= datepart(year,cast(a.KEA003 as datetime)))) as decimal(18,2))*100,'.00','%')
    from JSKKEA a ,JSKKEB b 
    where a.KEA001 = b.KEB001 
    group by KEA004,datepart(year,cast(KEA003 as datetime))
    )Tdrop table JSKKEA,JSKKEB
    /*
    1 客户a 2008 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 100万 100万 67%
    2 客户b 2008 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 50万 50万 33%
    1 客户b 2009 200万 100万 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 300万 60%
    2 客户a 2009 150万 50万 0万 0万 0万 0万 0万 0万 0万 0万 0万 0万 200万 40%
    */
      

  6.   

    -------------------------------------------
    --  Author : liangCK 小梁 & angellan 兰儿
    --  Comment: 小梁 爱 兰儿
    --  Date   : 2009-06-03 09:24:11
    -------------------------------------------
     
    --> 生成测试数据: [JSKKEA]
    IF OBJECT_ID('[JSKKEA]') IS NOT NULL DROP TABLE [JSKKEA]
    CREATE TABLE [JSKKEA] (KEA001 BIGINT,KEA003 DATETIME,KEA004 VARCHAR(5))
    INSERT INTO [JSKKEA]
    SELECT 20081230001,'20081230','客户a' UNION ALL
    SELECT 20081230002,'20081230','客户b' UNION ALL
    SELECT 20090101001,'20090101','客户a' UNION ALL
    SELECT 20090102001,'20090102','客户b' UNION ALL
    SELECT 20090103001,'20090103','客户a' UNION ALL
    SELECT 20090104001,'20090104','客户b' UNION ALL
    SELECT 20090201001,'20090201','客户a' UNION ALL
    SELECT 20090202001,'20090202','客户b'
     
    --> 生成测试数据: [JSKKEB]
    IF OBJECT_ID('[JSKKEB]') IS NOT NULL DROP TABLE [JSKKEB]
    CREATE TABLE [JSKKEB] (KEB001 BIGINT,KEA031 VARCHAR(5))
    INSERT INTO [JSKKEB]
    SELECT 20081230001,'100万' UNION ALL
    SELECT 20081230002,'50万' UNION ALL
    SELECT 20090101001,'100万' UNION ALL
    SELECT 20090102001,'100万' UNION ALL
    SELECT 20090103001,'50万' UNION ALL
    SELECT 20090104001,'100万' UNION ALL
    SELECT 20090201001,'50万' UNION ALL
    SELECT 20090202001,'100万'--SQL查询如下:SELECT
        A.KEA004 AS 客户名称,
        YEAR(A.KEA003) AS 年度,
        SUM(CASE WHEN MONTH(KEA003) = 1
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [1月份],
        SUM(CASE WHEN MONTH(KEA003) = 2
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [2月份],
        SUM(CASE WHEN MONTH(KEA003) = 3
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [3月份],
        SUM(CASE WHEN MONTH(KEA003) = 4
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [4月份],
        SUM(CASE WHEN MONTH(KEA003) = 5
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [5月份],
        SUM(CASE WHEN MONTH(KEA003) = 6
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [6月份],
        SUM(CASE WHEN MONTH(KEA003) = 7
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [7月份],
        SUM(CASE WHEN MONTH(KEA003) = 8
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [8月份],
        SUM(CASE WHEN MONTH(KEA003) = 9
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [9月份],
        SUM(CASE WHEN MONTH(KEA003) = 10
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [10月份],
        SUM(CASE WHEN MONTH(KEA003) = 11
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [11月份],
        SUM(CASE WHEN MONTH(KEA003) = 12
                    THEN LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1)
                 ELSE 0 END) AS [12月份],
        SUM(CAST(LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1) AS NUMERIC(20,4))) AS [总计],
        RTRIM(CAST(
           SUM(CAST(LEFT(B.KEA031,PATINDEX('%[^0-9.]%',B.KEA031)-1) AS NUMERIC(20,4))) * 100.
            /(SELECT SUM(CAST(LEFT(D.KEA031,PATINDEX('%[^0-9.]%',D.KEA031)-1) AS NUMERIC(20,4)))
              FROM [JSKKEA] AS C
                  JOIN [JSKKEB] AS D
              ON C.KEA001 = D.KEB001
              WHERE YEAR(C.KEA003) = YEAR(A.KEA003)) AS INT)) + '%' AS [比率]
    FROM [JSKKEA] AS A
        JOIN [JSKKEB] AS B
    ON A.KEA001 = B.KEB001
    GROUP BY A.KEA004,YEAR(A.KEA003)
    ORDER BY 2,1;
    --删除测试
    DROP TABLE [JSKKEA],[JSKKEB]/*
    客户名称  年度          1月份         2月份         3月份         4月份         5月份         6月份         7月份         8月份         9月份         10月份        11月份        12月份        总计                                      比率
    ----- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- --------------------------------------- -------------
    客户a   2008        0           0           0           0           0           0           0           0           0           0           0           100         100.0000                                66%
    客户b   2008        0           0           0           0           0           0           0           0           0           0           0           50          50.0000                                 33%
    客户a   2009        150         50          0           0           0           0           0           0           0           0           0           0           200.0000                                40%
    客户b   2009        200         100         0           0           0           0           0           0           0           0           0           0           300.0000                                60%(4 row(s) affected)*/
      

  7.   

    DECLARE @TA TABLE([KEA001] VARCHAR(11), [KEA003] VARCHAR(8), [KEA004] NVARCHAR(3))
    INSERT @TA 
    SELECT '20081230001', '20081230', N'客户a' UNION ALL 
    SELECT '20081230002', '20081230', N'客户b' UNION ALL 
    SELECT '20090101001', '20090101', N'客户a' UNION ALL 
    SELECT '20090102001', '20090102', N'客户b' UNION ALL 
    SELECT '20090103001', '20090103', N'客户a' UNION ALL 
    SELECT '20090104001', '20090104', N'客户b' UNION ALL 
    SELECT '20090201001', '20090201', N'客户a' UNION ALL 
    SELECT '20090202001', '20090202', N'客户b'DECLARE @TB TABLE([KEB001] VARCHAR(11), [KEA031] INT)
    INSERT @TB 
    SELECT '20081230001', 100 UNION ALL 
    SELECT '20081230002', 50 UNION ALL 
    SELECT '20090101001', 100 UNION ALL 
    SELECT '20090102001', 100 UNION ALL 
    SELECT '20090103001', 50 UNION ALL 
    SELECT '20090104001', 100 UNION ALL 
    SELECT '20090201001', 50 UNION ALL 
    SELECT '20090202001', 100SELECT *,ID=IDENTITY(int,1,1) INTO #
    FROM @TA JOIN @TB ON 
      [KEA001]=[KEB001]DECLARE @STR NVARCHAR(4000)
    SET @STR=N''
    SELECT @STR=@STR+N','+N'MAX(CASE WHEN MONTH([KEA003])='+RTRIM(M)+N' THEN RTRIM([KEA031]) ELSE '''' END) AS ['+RTRIM(M)+N'月份]'
    FROM (
    SELECT M=1 UNION ALL
    SELECT 2 UNION ALL
    SELECT 3 UNION ALL
    SELECT 4 UNION ALL
    SELECT 5 UNION ALL
    SELECT 6 UNION ALL
    SELECT 7 UNION ALL
    SELECT 8 UNION ALL
    SELECT 9 UNION ALL
    SELECT 10 UNION ALL
    SELECT 11 UNION ALL
    SELECT 12) TEXEC(
    N' SELECT * FROM ('+
    N' SELECT [KEA004] AS 客户名称,YEAR([KEA003]) AS 年度'+@STR+N',SUM([KEA031]) AS 总计, RTRIM(CAST((SUM([KEA031])*1.0/(SELECT SUM([KEA031]) FROM # WHERE YEAR([KEA003])=YEAR(TA.[KEA003]))) AS NUMERIC(4,2))*100)+''%'' AS 比率'+
    N' FROM # AS TA GROUP BY [KEA004],YEAR([KEA003]) '+
    N' ) TB ORDER BY 年度,总计 DESC')DROP TABLE #
    /*
    客户a 2008 100 100 67.00%
    客户b 2008 50 50 33.00%
    客户b 2009 100 100 300 60.00%
    客户a 2009 50 50 200 40.00%
    */
      

  8.   

    DECLARE @TA TABLE([KEA001] VARCHAR(11), [KEA003] VARCHAR(8), [KEA004] NVARCHAR(3))
    INSERT @TA 
    SELECT '20081230001', '20081230', N'客户a' UNION ALL 
    SELECT '20081230002', '20081230', N'客户b' UNION ALL 
    SELECT '20090101001', '20090101', N'客户a' UNION ALL 
    SELECT '20090102001', '20090102', N'客户b' UNION ALL 
    SELECT '20090103001', '20090103', N'客户a' UNION ALL 
    SELECT '20090104001', '20090104', N'客户b' UNION ALL 
    SELECT '20090201001', '20090201', N'客户a' UNION ALL 
    SELECT '20090202001', '20090202', N'客户b'DECLARE @TB TABLE([KEB001] VARCHAR(11), [KEA031] INT)
    INSERT @TB 
    SELECT '20081230001', 100 UNION ALL 
    SELECT '20081230002', 50 UNION ALL 
    SELECT '20090101001', 100 UNION ALL 
    SELECT '20090102001', 100 UNION ALL 
    SELECT '20090103001', 50 UNION ALL 
    SELECT '20090104001', 100 UNION ALL 
    SELECT '20090201001', 50 UNION ALL 
    SELECT '20090202001', 100SELECT *,ID=IDENTITY(int,1,1) INTO #
    FROM @TA JOIN @TB ON 
      [KEA001]=[KEB001]DECLARE @STR NVARCHAR(4000)
    SET @STR=N''
    SELECT @STR=@STR+N','+N'MAX(CASE WHEN MONTH([KEA003])='+RTRIM(M)+N' THEN RTRIM([KEA031])+N''万'' ELSE '''' END) AS ['+RTRIM(M)+N'月份]'
    FROM (
    SELECT M=1 UNION ALL
    SELECT 2 UNION ALL
    SELECT 3 UNION ALL
    SELECT 4 UNION ALL
    SELECT 5 UNION ALL
    SELECT 6 UNION ALL
    SELECT 7 UNION ALL
    SELECT 8 UNION ALL
    SELECT 9 UNION ALL
    SELECT 10 UNION ALL
    SELECT 11 UNION ALL
    SELECT 12) TEXEC(
    N' SELECT * FROM ('+
    N' SELECT [KEA004] AS 客户名称,YEAR([KEA003]) AS 年度'+@STR+N',rtrim(SUM([KEA031]))+N''万'' AS 总计, RTRIM(CAST((SUM([KEA031])*1.0/(SELECT SUM([KEA031]) FROM # WHERE YEAR([KEA003])=YEAR(TA.[KEA003]))) AS NUMERIC(4,2))*100)+''%'' AS 比率'+
    N' FROM # AS TA GROUP BY [KEA004],YEAR([KEA003]) '+
    N' ) TB ORDER BY 年度,总计 DESC')DROP TABLE #
    /*
    客户名称 年度          1月份           2月份           3月份           4月份           5月份           6月份           7月份           8月份           9月份           10月份          11月份          12月份          总计            比率
    ---- ----------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------------------------------------
    客户b  2008                                                                                                                                                                  50万           50万           33.00%
    客户a  2008                                                                                                                                                                  100万          100万          67.00%
    客户b  2009        100万          100万                                                                                                                                                      300万          60.00%
    客户a  2009        50万           50万                                                                                                                                                       200万          40.00%
    */
      

  9.   

    DECLARE @TA TABLE([KEA001] VARCHAR(11), [KEA003] VARCHAR(8), [KEA004] NVARCHAR(3))
    INSERT @TA 
    SELECT '20081230001', '20081230', N'客户a' UNION ALL 
    SELECT '20081230002', '20081230', N'客户b' UNION ALL 
    SELECT '20090101001', '20090101', N'客户a' UNION ALL 
    SELECT '20090102001', '20090102', N'客户b' UNION ALL 
    SELECT '20090103001', '20090103', N'客户a' UNION ALL 
    SELECT '20090104001', '20090104', N'客户b' UNION ALL 
    SELECT '20090201001', '20090201', N'客户a' UNION ALL 
    SELECT '20090202001', '20090202', N'客户b'DECLARE @TB TABLE([KEB001] VARCHAR(11), [KEA031] INT)
    INSERT @TB 
    SELECT '20081230001', 100 UNION ALL 
    SELECT '20081230002', 50 UNION ALL 
    SELECT '20090101001', 100 UNION ALL 
    SELECT '20090102001', 100 UNION ALL 
    SELECT '20090103001', 50 UNION ALL 
    SELECT '20090104001', 100 UNION ALL 
    SELECT '20090201001', 50 UNION ALL 
    SELECT '20090202001', 100SELECT *,ID=IDENTITY(int,1,1) INTO #
    FROM @TA JOIN @TB ON 
      [KEA001]=[KEB001]DECLARE @STR NVARCHAR(4000)
    SET @STR=N''
    SELECT @STR=@STR+N','+N'MAX(CASE WHEN MONTH([KEA003])='+RTRIM(M)+N' THEN RTRIM([KEA031])+N''万'' ELSE '''' END) AS ['+RTRIM(M)+N'月份]'
    FROM (
    SELECT M=1 UNION ALL
    SELECT 2 UNION ALL
    SELECT 3 UNION ALL
    SELECT 4 UNION ALL
    SELECT 5 UNION ALL
    SELECT 6 UNION ALL
    SELECT 7 UNION ALL
    SELECT 8 UNION ALL
    SELECT 9 UNION ALL
    SELECT 10 UNION ALL
    SELECT 11 UNION ALL
    SELECT 12) TEXEC(
    N' SELECT 排名=ROW_NUMBER() OVER (PARTITION BY 年度 ORDER BY CAST(LEFT(总计,LEN(总计)-1) AS INT) DESC),* FROM ('+
    N' SELECT [KEA004] AS 客户名称,YEAR([KEA003]) AS 年度'+@STR+N',rtrim(SUM([KEA031]))+N''万'' AS 总计, RTRIM(CAST((SUM([KEA031])*1.0/(SELECT SUM([KEA031]) FROM # WHERE YEAR([KEA003])=YEAR(TA.[KEA003]))) AS NUMERIC(4,2))*100)+''%'' AS 比率'+
    N' FROM # AS TA GROUP BY [KEA004],YEAR([KEA003]) '+
    N' ) TB ORDER BY 年度,CAST(LEFT(总计,LEN(总计)-1) AS INT) DESC')DROP TABLE #
    /*
    排名                   客户名称 年度          1月份           2月份           3月份           4月份           5月份           6月份           7月份           8月份           9月份           10月份          11月份          12月份          总计            比率
    -------------------- ---- ----------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------- ------------------------------------------
    1                    客户a  2008                                                                                                                                                                  100万          100万          67.00%
    2                    客户b  2008                                                                                                                                                                  50万           50万           33.00%
    1                    客户b  2009        100万          100万                                                                                                                                                      300万          60.00%
    2                    客户a  2009        50万           50万                                                                                                                                                       200万          40.00%                                                                                                                                                      200万          40.00%
    */
      

  10.   


    给个建议.
     KEA031(本币税价合计)  
    不要把单位"万"这些存进去.可以用一个列来存单位.
      

  11.   


    还有.像这种代码就不用动态的SQL的.列是固定的.
    就直接把10个列写出来就可以了..这样可以更好的缓存计划.
      

  12.   


    动态的SQL,什么缓存计划,不好意思地说……不懂……
    嗯,我要好好学习,嘻嘻