表内容如下:
施工日期       业务类别 合同号
2009-1-1        A          HI001
2010-12-5        B          HI002
2008-10-6        C          HI003
2011-5-6        A          HI001
2012-3-27        F          HI004想统计的结果如下:
年度 业务类别   1月合同数     2月合同数 3月合同数    …
2008   A
2008   B
...
2009  
2010
…每个合同号可能有多次施工记录,比如,合同号HI001,分别在2009-1-1 和2011-5-6施工过,重复合同号不用统计在线求助,谢谢!

解决方案 »

  1.   

    select year(施工日期),业务类别,
        COUNT(DISTINCT CASE WHEN MONTH(施工日期)=1 THEN 合同号 END) AS [1月合同数],
        COUNT(DISTINCT CASE WHEN MONTH(施工日期)=2 THEN 合同号 END) AS [2月合同数]
        --。
    from tb
    group by year(施工日期),业务类别
    ORDER BY 1,2
      

  2.   


    --> 测试数据:[tbl]
    if object_id('[tbl]') is not null drop table [tbl]
    create table [tbl]([施工日期] datetime,[业务类别] varchar(1),[合同号] varchar(5))
    insert [tbl]
    select '2009-1-1','A','HI001' union all
    select '2010-12-5','B','HI002' union all
    select '2008-10-6','C','HI003' union all
    select '2011-5-6','A','HI001' union all
    select '2012-3-27','F','HI004'declare @str varchar(max)
    set @str=''
    select @str=@str+','+'['+LTRIM(MONTH([施工日期]))+'月份合同数]'+
    '=sum(case when MONTH([施工日期])='+ltrim(MONTH([施工日期]))+
    ' then 1 else 0 end)' from tbl group by MONTH([施工日期])
    print @str
    exec('select year([施工日期]) as 年份,[业务类别]'
    +@str+' from tbl group by year([施工日期]),[业务类别]')
    /*
    年份 业务类别 1月份合同数 3月份合同数 5月份合同数 10月份合同数 12月份合同数
    2009 A 1 0 0 0 0
    2011 A 0 0 1 0 0
    2010 B 0 0 0 0 1
    2008 C 0 0 0 1 0
    2012 F 0 1 0 0 0
    */
      

  3.   

    select year(施工日期),业务类别,
        COUNT(DISTINCT CASE WHEN MONTH(施工日期)=1 THEN 合同号 END) AS [1月合同数],
        COUNT(DISTINCT CASE WHEN MONTH(施工日期)=2 THEN 合同号 END) AS [2月合同数]
        --。
    from tb
    group by year(施工日期),业务类别
      

  4.   


    CREATE TABLE TEMP(施工日期 DATETIME,业务类别 VARCHAR(200),合同号 VARCHAR(200))
    CREATE TABLE TEMP1(施工日期 DATETIME,业务类别 VARCHAR(200),合同号 VARCHAR(200))INSERT INTO TEMP
    select '2009-1-1','A','HI001'
    UNION ALL
    select '2010-12-5','B','HI002'
    UNION ALL
    select '2008-10-6','C','HI003'
    UNION ALL
    select '2011-5-6','A','HI001'
    UNION ALL
    select '2012-3-27','F','HI004'DECLARE @施工日期 DATETIME,@业务类别 VARCHAR(200),@合同号 VARCHAR(200)DECLARE CUR CURSOR FOR
    SELECT * FROM TEMP
    ORDER BY 施工日期
    OPEN CUR 
    FETCH NEXT FROM CUR INTO @施工日期,@业务类别,@合同号
    WHILE @@FETCH_STATUS=0
    BEGIN
    INSERT INTO TEMP1
    SELECT  @施工日期,@业务类别,@合同号
    WHERE NOT EXISTS(SELECT 1 FROM TEMP1 WHERE 合同号=@合同号)
    FETCH NEXT FROM CUR INTO @施工日期,@业务类别,@合同号
    ENDCLOSE CUR
    DEALLOCATE CURSELECT YEAR(施工日期) AS [年度] ,业务类别 AS [业务类别],
    SUM(CASE MONTH(施工日期) WHEN 1 THEN 1 ELSE 0 END) AS [1月合同数],
    SUM(CASE MONTH(施工日期) WHEN 2 THEN 1 ELSE 0 END) AS [2月合同数],
    SUM(CASE MONTH(施工日期) WHEN 3 THEN 1 ELSE 0 END) AS [3月合同数],
    SUM(CASE MONTH(施工日期) WHEN 4 THEN 1 ELSE 0 END) AS [4月合同数],
    SUM(CASE MONTH(施工日期) WHEN 5 THEN 1 ELSE 0 END) AS [5月合同数],
    SUM(CASE MONTH(施工日期) WHEN 6 THEN 1 ELSE 0 END) AS [6月合同数],
    SUM(CASE MONTH(施工日期) WHEN 7 THEN 1 ELSE 0 END) AS [7月合同数],
    SUM(CASE MONTH(施工日期) WHEN 8 THEN 1 ELSE 0 END) AS [8月合同数],
    SUM(CASE MONTH(施工日期) WHEN 9 THEN 1 ELSE 0 END) AS [9月合同数],
    SUM(CASE MONTH(施工日期) WHEN 10 THEN 1 ELSE 0 END) AS [10月合同数],
    SUM(CASE MONTH(施工日期) WHEN 11 THEN 1 ELSE 0 END) AS [11月合同数],
    SUM(CASE MONTH(施工日期) WHEN 12 THEN 1 ELSE 0 END) AS [12月合同数]
    FROM TEMP1
    GROUP BY YEAR(施工日期),MONTH(施工日期),业务类别
    ORDER BY YEAR(施工日期),业务类别DROP TABLE TEMP
    DROP TABLE TEMP1