marco08(天道酬勤)兄,接着前面的问题,
品名         2006-11     2006-12     2007-01     
---------- ----------- ----------- ----------- 
产品1        0           30          0
产品2        15          0           0
产品3        12          0           0
产品4        0           0           10
产品6        0           0           25我要横向统计数量大于0的总月份数,如
产品1为1个月
产品2为1个月
.......
如此这般,如果两个月都有数的就返回2,三个月都有数的就返回3
这个用sql该怎么写?

解决方案 »

  1.   

    create table A(序号 int, 品名 nvarchar(10), 数量 int, 日期 datetime)
    insert A select 1, '产品1', 20, '2006-12-9'
    union all select 2, '产品1', 10, '2006-12-15'
    union all select 3, '产品2', 15,'2006-11-23'
    union all select 4, '产品3', 12,'2006-11-24'
    union all select 5, '产品4', 10,'2007-01-4'
    union all select 6, '产品6', 10,'2007-01-8'
    union all select 7, '产品6', 15,'2007-01-7'declare @sql varchar(8000)
    set @sql='select 品名, '
    select @sql=@sql+quotename(日期)+'=sum(case when convert(char(7), 日期, 120)='+quotename(日期, '''')+' then 数量 else 0 end), ' from
    (
    select  日期=convert(char(7), 日期, 120) 
    from A
    group by convert(char(7), 日期, 120) 
    )tmp
    set @sql=@sql+' [大於0的月數]=(select count(distinct convert(char(7), 日期, 120)) from A where 品名=tmp.品名 and 数量>0 group by convert(char(7), 日期, 120)) from A as tmp group by 品名'
    exec(@sql)--result
    品名         2006-11     2006-12     2007-01     大於0的月數      
    ---------- ----------- ----------- ----------- ----------- 
    产品1        0           30          0           1
    产品2        15          0           0           1
    产品3        12          0           0           1
    产品4        0           0           10          1
    产品6        0           0           25          1
      

  2.   

    --trycreate table A(序号 int, 品名 nvarchar(10), 数量 int, 日期 datetime)
    insert A select 1, '产品1', 20, '2006-12-9'
    union all select 2, '产品1', 10, '2006-12-15'
    union all select 3, '产品2', 15,'2006-11-23'
    union all select 3, '产品2', 25,'2006-12-20'
    union all select 4, '产品3', 12,'2006-11-24'
    union all select 5, '产品4', 10,'2007-01-4'
    union all select 6, '产品6', 10,'2007-01-8'
    union all select 7, '产品6', 15,'2007-01-7'declare @sql varchar(8000)
    set @sql='select 品名, '
    select @sql=@sql+quotename(日期)+'=sum(case when convert(char(7), 日期, 120)='+quotename(日期, '''')+' then 数量 else 0 end), ' from
    (
    select  日期=convert(char(7), 日期, 120) 
    from A
    group by convert(char(7), 日期, 120) 
    )tmp
    set @sql=@sql+' [大於0的月數]=( select sum(num) from 
    (
    select num=count(distinct convert(char(7), 日期, 120)) 
    from A 
    where 品名=tmp.品名 and 数量>0 
    group by convert(char(7), 日期, 120)
    )tmp_num
    ) from A as tmp group by 品名'
    exec(@sql)--result
    品名         2006-11     2006-12     2007-01     大於0的月數      
    ---------- ----------- ----------- ----------- ----------- 
    产品1        0           30          0           1
    产品2        15          25          0           2
    产品3        12          0           0           1
    产品4        0           0           10          1
    产品6        0           0           25          1
      

  3.   

    为什么我引有用到我的例子上就报错了呢?
    declare @sql varchar(8000)
    set @sql='select 品名, '
    select @sql=@sql+quotename(日期)+'=sum(case when convert(char(7), 开单日期, 120)='+quotename(日期, '''')+' then 数量 else 0 end), ' from
    (
    select  日期=convert(char(7), 开单日期, 120) 
    from tab
    group by convert(char(7), 开单日期, 120) 
    )tmp
    set @sql=@sql+' [销售总月數] = (select count(distinct convert(char(7), 开单日期, 120)) from tab where 品名=tmp.品名 and 数量>0 group by convert(char(7), 开单日期, 120)) from tab as tmp group by 品名'
    exec(@sql)
    服务器: 消息 512,级别 16,状态 1,行 1
    子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。这语句有点复杂,有点看不懂,介绍一本好书来看看吧
      

  4.   

    《SQL SERVER 2000 開發與管理應用實例》鄒建   人民郵電出版社
      

  5.   

    marco08(天道酬勤) 的语句没有问题啊,你的语句检查一下