抱歉贴子有错,更正如下:
执行1:
Pr_100 '2009','2009'
结果1:
KIND   01      02
   A   10       4
   B    3       2
   C    1       1
意思是:IN_YEAR为2009年,DOC_TYPE_CODE为 01,CALL_NO第一个字母为A的数量为10,其它类推,执行2:
Pr_100 '2008','2009'
结果2:
KIND   01      02
A      16       8
B       5       4
C       2       2
意思是:IN_YEAR为2008年-2009年,DOC_TYPE_CODE为 01,CALL_NO第一个字母为A的数量为16,其它类推,其中A,B,C及01,02是动态的,有D,E,F,03,04,05....等等,问题的铺垫比较长,望大虾先能拨冗看一看!!
我的问题是得到数量的同时希望能得到"种数",所谓"种数"就是在相同的IN_YEAR,但CALL_NO不相同的数量,
例如
2009,DOC_TYPE_CODE为 01的有A00001,A00002,A00003,A00004,这就是4种,数量是10,因为都是A开头
2009,DOC_TYPE_CODE为 02的只有A00001,A00002,A00003,这就是3种,数量是4以结果1为例,希望得到:
KIND   01      02   01种数   02种数
   A    10      4        4        3
   B    3       2     .........        
   C    1       1     .........如果困难的话,分开为两个表也可以!!
不知道讲清楚了没有?
望大虾指教,小弟不胜感谢!!

解决方案 »

  1.   

    select kind=left(call_no,1),[01]=sum(case when DOC_TYPE_CODE ='01' then 1 else 0 end),
            [02]=sum(case when DOC_TYPE_CODE ='02' then 1 else 0 end),
            [01种数]= count(distinct case when  DOC_TYPE_CODE ='01' then call_no end) ,
            [02种数]=  count(distinct case when  DOC_TYPE_CODE ='02' then call_no end)
    from (select * from item where IN_YEAR='2009')K
    group by left(call_no,1)kind 01 02 01种数 02种数
    A 10 4 4 3
    B 3 2 2 2
    C 1 1 1 1
      

  2.   

    declare @s nvarchar(4000)
    set @s=''
    Select  @s=@s+','+quotename(DOC_TYPE_CODE)+'=sum(case when DOC_TYPE_CODE='''+DOC_TYPE_CODE+''' then 1 else 0 end),['+
    DOC_TYPE_CODE+'总数]=count(distinct case when DOC_TYPE_CODE='''+DOC_TYPE_CODE+''' then 1 else 0 end)'
    from item group by DOC_TYPE_CODE
    exec('select CALL_NO=left(CALL_NO,1) '+@s+' from item group by left(CALL_NO,1)')/*
    CALL_NO 01          01总数        02          02总数        
    ------- ----------- ----------- ----------- ----------- 
    A       16          2           8           2
    B       6           2           4           2
    C       3           2           2           2
    */--自己加条件
      

  3.   

    这个语句没搞懂!!where 加在那里??望指教!!!
      

  4.   

    像这样..if object_id('item')is not null
       drop table item
    if object_id('pr_100') is not null
       drop procedure pr_100 
    create table ITEM(DOC_TYPE_CODE varchar(2),CALL_NO varchar(10),IN_YEAR int) 
    insert into ITEM select '01','A00001',2008 
    insert into ITEM select '01','A00001',2008 
    insert into ITEM select '01','A00001',2009 
    insert into ITEM select '01','A00001',2009 
    insert into ITEM select '01','A00001',2009 
    insert into ITEM select '01','A00002',2008 
    insert into ITEM select '01','A00002',2008 
    insert into ITEM select '01','A00002',2008 
    insert into ITEM select '01','A00002',2009 
    insert into ITEM select '01','A00002',2009 
    insert into ITEM select '01','A00002',2009 
    insert into ITEM select '01','A00002',2009 
    insert into ITEM select '01','A00003',2008 
    insert into ITEM select '01','A00003',2009 
    insert into ITEM select '01','A00003',2009 
    insert into ITEM select '01','A00004',2009 
    insert into ITEM select '01','B00001',2008 
    insert into ITEM select '01','B00001',2008 
    insert into ITEM select '01','B00001',2009 
    insert into ITEM select '01','B00001',2009 
    insert into ITEM select '01','B00002',2007 
    insert into ITEM select '01','B00002',2009 
    insert into ITEM select '01','C00005',2007 
    insert into ITEM select '01','C00005',2008 
    insert into ITEM select '01','C00005',2009 
    insert into ITEM select '02','A00001',2008 
    insert into ITEM select '02','A00001',2009 
    insert into ITEM select '02','A00001',2009 
    insert into ITEM select '02','A00002',2008 
    insert into ITEM select '02','A00002',2008 
    insert into ITEM select '02','A00002',2009 
    insert into ITEM select '02','A00003',2008 
    insert into ITEM select '02','A00003',2009 
    insert into ITEM select '02','B00001',2008 
    insert into ITEM select '02','B00001',2008 
    insert into ITEM select '02','B00001',2009 
    insert into ITEM select '02','B00002',2009 
    insert into ITEM select '02','C00005',2008 
    insert into ITEM select '02','C00005',2009 
    go
    create proc pr_100
    @lendDate1 varchar(4), 
    @lendDate2 varchar(4)
    as 
    set nocount on
    select * from (select DOC_TYPE_CODE,LEFT(CALL_NO,1) call_no,in_year from ITEM where IN_YEAR between @lendDate1 and @lendDate2) a pivot (count(in_year) for DOC_TYPE_CODE in ([01],[02])) b
    set nocount off
    go
    exec pr_100 '2009','2009' 
    exec pr_100 '2008','2009' 
    1 行受影响)(1 行受影响)
    call_no 01          02
    ------- ----------- -----------
    A       10          4
    B       3           2
    C       1           1call_no 01          02
    ------- ----------- -----------
    A       16          8
    B       5           4
    C       2           2
      

  5.   

    CREATE  proc Pr_100 
    @lendDate1 varchar(4), 
    @lendDate2 varchar(4) 
    AS 
    DECLARE @SQL VARCHAR(5000) 
    SET @SQL='SELECT UPPER(left(call_no,1)) as KIND' 
    SELECT @SQL= @SQL+ ',sum(CASE WHEN DOC_TYPE_CODE = '''+DOC_TYPE_CODE+''' THEN 1 else 0 END)  ['+DOC_TYPE_CODE+'],['+
    DOC_TYPE_CODE+'总数]=count(distinct case when DOC_TYPE_CODE='''+DOC_TYPE_CODE+''' then call_no end)' 
    FROM (SELECT DISTINCT DOC_TYPE_CODE FROM Item ) as  A ORDER BY DOC_TYPE_CODE 
    SET @SQL=@SQL+' FROM (SELECT * from item where IN_YEAR BETWEEN  '''+@lendDate1+''' AND '''+@lendDate2+''' ) X 
    GROUP  BY  UPPER(left(call_no,1)) 
    ORDER BY UPPER(left(call_no,1)) ' 
    EXEC  (@SQL) 
    Pr_100 '2009','2009'  KIND 01          01总数        02          02总数
    ---- ----------- ----------- ----------- -----------
    A    10          4           4           3
    B    3           2           2           2
    C    1           1           1           1
    (3 行受影响)Pr_100 '2008','2009' KIND 01          01总数        02          02总数
    ---- ----------- ----------- ----------- -----------
    A    16          4           8           3
    B    5           2           4           2
    C    2           1           2           1
    (3 行受影响)