这不是行转列. group by 就可以了.

解决方案 »

  1.   

    create function aaa(@riqi datetime,@dianming nvarchar,@chanpinming nvarchar)
    returns int
    as
    begin
    declare @i int
    set @i=0
    select @i=@i+1 from 表 where 日期=@riqi and 超市名称=@dianming
    end
    return @i+1
    select sum(单价*数量),sum(产品名称),aaa(日期,超市名称,产品名称)as 排名 from 表 group by 日期,超市名称,产品名称
      

  2.   

    --先不管排名:create table test(日期 datetime,商超名称 varchar(10),分店名称 varchar(10),产品名称 varchar(10),数量 int,单价 money)
    insert into test select '2006-11-09','好又多  ','中天店  ',rtrim('八年  '), 2,76
    insert into test select '2006-11-09','好又多  ','中天店  ',rtrim('五年  '), 1,35
    insert into test select '2006-11-09','好又多  ','中天店  ',rtrim('老白干'),10,4.3
    insert into test select '2006-11-10','北京华联','盐市口店',rtrim('甲级  '),30,29.8
    go
    declare @sql varchar(8000)
    set @sql=''
    select @sql=@sql+','+rtrim(产品名称)+'销量=sum(case 产品名称 when '''+rtrim(产品名称)+''' then 数量      else 0 end)'
                    +','+rtrim(产品名称)+'金额=sum(case 产品名称 when '''+rtrim(产品名称)+''' then 数量*单价 else 0 end)'
    from (select distinct 产品名称 from test) tset @sql='select 商超名称,分店名称'
              +',本日销量=sum(case datediff(day,日期,getdate()) when 0 then t.数量 else 0 end)'
              +',累计销量=sum(数量)'
              +@sql
              +' from test t group by 商超名称,分店名称'exec(@sql)
    go
    drop table test
    go
      

  3.   

    if object_id('pubs..TT') is not null
       drop table TT
    gocreate table TT(日期 datetime,商超名称 varchar(10),分店名称 varchar(10),产品名称 varchar(10),数量 int,单价 decimal(18,2))insert into TT(日期,商超名称,分店名称,产品名称,数量,单价) values('2006-11-09', '好又多',     '中天店',   '八年',     2,    76)
    insert into TT(日期,商超名称,分店名称,产品名称,数量,单价) values('2006-11-09', '好又多',     '中天店',   '五年',     1,    35)
    insert into TT(日期,商超名称,分店名称,产品名称,数量,单价) values('2006-11-09', '好又多',     '中天店',   '老白干',     10,    4.3)
    insert into TT(日期,商超名称,分店名称,产品名称,数量,单价) values('2006-11-10', '好又多',     '中天店',   '老白干',     10,    4.3)
    insert into TT(日期,商超名称,分店名称,产品名称,数量,单价) values('2006-11-09', '北京华联',     '盐市口店',   '甲级',     30,    29.8)
    insert into TT(日期,商超名称,分店名称,产品名称,数量,单价) values('2006-11-10', '北京华联',     '盐市口店',   '甲级',     30,    29.8)--累计销量
    if object_id('pubs..ta') is not null
       drop table ta
    go
    select 商超名称 , 分店名称 , sum(数量) as 累计销量 into ta from TT group by 商超名称 , 分店名称--本日销量
    if object_id('pubs..tb') is not null
       drop table tb
    go
    select 商超名称 , 分店名称 , sum(数量) as 本日销量 into tb from tt where convert(varchar(10),日期,120) = '2006-11-09' group by 商超名称 , 分店名称--利用函数实现行列转换
        declare @sql varchar(8000)
        set @sql = '' 
        select @sql = @sql + ' , sum(case 产品名称 when ''' + 产品名称 + ''' then 数量 else 0 end) [' + 产品名称 + '销量' + ']'
                           + ' , sum(case 产品名称 when ''' + 产品名称 + ''' then 数量*单价 else 0 end) [' + 产品名称 + '金额' + ']'
        from (select distinct 产品名称 from tt where convert(varchar(10),日期,120) = '2006-11-09') as a
        set @sql =  'select a1.商超名称 , a1.分店名称 , a2.本日销量 , a1.累计销量 , a2.本日销量排名 , a1.累计销量排名 , a3.* from ' +
                    '(
                        select a.* , 累计销量排名 = (SELECT COUNT(累计销量) FROM ta WHERE 累计销量 > a.累计销量) + 1 from 
                        ta a 
                     ) a1,
                    ' +
                    '
                     (
                        select b.* , 本日销量排名 = (SELECT COUNT(本日销量) FROM tb WHERE 本日销量 > b.本日销量) + 1 from 
                        tb b
                     ) a2,
                    ' +
                    '
                     (
                     select 商超名称 , 分店名称' + @sql + ' from tt group by 商超名称 , 分店名称
                     ) a3
                    where a1.商超名称 = a2.商超名称 and a1.商超名称 = a3.商超名称 and
                          a1.分店名称 = a2.分店名称 and a1.分店名称 = a3.分店名称'
        exec(@sql) 
    商超名称 分店名称 本日销量 累计销量 本日销量排名 累计销量排名 八年销量 八年金额 甲级销量 甲级金额 老白干销量 老白干金额 五年销量 五年金额
    -------- -------- -------- -------- ------------ ------------ -------- -------- -------- -------- ---------- ---------- -------- --------
    北京华联 盐市口店 30       60       1            1            0        .00      60       1788.00  0          .00        0        .00
    好又多   中天店   13       23       2            2            2        152.00   0        .00      20         86.00      1        35.00
      

  4.   

    --这两行数据是我加的。
    insert into TT(日期,商超名称,分店名称,产品名称,数量,单价) values('2006-11-10','好又多','中天店','老白干',10,4.3)
    insert into TT(日期,商超名称,分店名称,产品名称,数量,单价) values('2006-11-09','北京华联','盐市口店','甲级',30,29.8)--以下为全部代码if object_id('pubs..TT') is not null
       drop table TT
    gocreate table TT(日期 datetime,商超名称 varchar(10),分店名称 varchar(10),产品名称 varchar(10),数量 int,单价 decimal(18,2))insert into TT(日期,商超名称,分店名称,产品名称,数量,单价) values('2006-11-09','好又多','中天店','八年',2,76)
    insert into TT(日期,商超名称,分店名称,产品名称,数量,单价) values('2006-11-09','好又多','中天店','五年',1,35)
    insert into TT(日期,商超名称,分店名称,产品名称,数量,单价) values('2006-11-09','好又多','中天店','老白干',10,4.3)
    insert into TT(日期,商超名称,分店名称,产品名称,数量,单价) values('2006-11-10','北京华联','盐市口店','甲级',30,29.8)
    --这两行数据是我加的。
    insert into TT(日期,商超名称,分店名称,产品名称,数量,单价) values('2006-11-10','好又多','中天店','老白干',10,4.3)
    insert into TT(日期,商超名称,分店名称,产品名称,数量,单价) values('2006-11-09','北京华联','盐市口店','甲级',30,29.8)
    go--累计销量
    if object_id('pubs..ta') is not null
       drop table ta
    go
    select 商超名称 , 分店名称 , sum(数量) as 累计销量 into ta from TT group by 商超名称 , 分店名称--本日销量
    if object_id('pubs..tb') is not null
       drop table tb
    go
    select 商超名称 , 分店名称 , sum(数量) as 本日销量 into tb from tt where convert(varchar(10),日期,120) = '2006-11-09' group by 商超名称 , 分店名称--利用函数实现行列转换
        declare @sql varchar(8000)
        set @sql = '' 
        select @sql = @sql + ' , sum(case 产品名称 when ''' + 产品名称 + ''' then 数量 else 0 end) [' + 产品名称 + '销量' + ']'
                           + ' , sum(case 产品名称 when ''' + 产品名称 + ''' then 数量*单价 else 0 end) [' + 产品名称 + '金额' + ']'
        from (select distinct 产品名称 from tt where convert(varchar(10),日期,120) = '2006-11-09') as a
        set @sql =  'select a1.商超名称 , a1.分店名称 , a2.本日销量 , a1.累计销量 , a2.本日销量排名 , a1.累计销量排名 , a3.* from ' +
                    '(
                        select a.* , 累计销量排名 = (SELECT COUNT(累计销量) FROM ta WHERE 累计销量 > a.累计销量) + 1 from 
                        ta a 
                     ) a1,
                    ' +
                    '
                     (
                        select b.* , 本日销量排名 = (SELECT COUNT(本日销量) FROM tb WHERE 本日销量 > b.本日销量) + 1 from 
                        tb b
                     ) a2,
                    ' +
                    '
                     (
                     select 商超名称 , 分店名称' + @sql + ' from tt group by 商超名称 , 分店名称
                     ) a3
                    where a1.商超名称 = a2.商超名称 and a1.商超名称 = a3.商超名称 and
                          a1.分店名称 = a2.分店名称 and a1.分店名称 = a3.分店名称'
        exec(@sql) 商超名称 分店名称 本日销量 累计销量 本日销量排名 累计销量排名 八年销量 八年金额 甲级销量 甲级金额 老白干销量 老白干金额 五年销量 五年金额
    -------- -------- -------- -------- ------------ ------------ -------- -------- -------- -------- ---------- ---------- -------- --------
    北京华联 盐市口店 30       60       1            1            0        .00      60       1788.00  0          .00        0        .00
    好又多   中天店   13       23       2            2            2        152.00   0        .00      20         86.00      1        35.00
      

  5.   

    select * from t
    declare @sql varchar(8000)
    declare @sql1 varchar(8000)
    set @sql=''
    select @sql=@sql+', sum(case 产品名称 when '''+a.产品名称+''' then 数量 else 0 end) as ['+a.产品名称+']' from (select distinct 产品名称 from t where 日期='2006-11-09') a
    set @sql= 'select 分店名称 '+@sql+ ' from t group by 分店名称'set @sql='select bb.*,aa.* from ('+@sql+') aa'set @sql1=
    'select c.*,
    排名=(select count(*)+1 from (select 分店名称,sum(数量) as 本日销售,sum(数量) as 累计销售 from t b group by 分店名称 ) b where b.本日销售>c.本日销售)
     from (select 分店名称,sum(数量) as 本日销售,sum(数量) as 累计销售 from t b group by 分店名称 ) c'
    set @sql=@sql+' ,( '+@sql1+') bb where aa.分店名称=bb.分店名称'exec(@sql)-------------------------------------------------------------------
    盐市口店 30 30 1 0 0 0
    中天店 13 13 2 2 10 1
      

  6.   

    --建立測試環境
    /*Fname:商超名稱
       Cname:分店名稱
       Fname:產品名稱*/
    GO
    create table t(rq datetime,Fname varchar(50),Cname varchar(50),Pname varchar(50),num int,value numeric(9,2))
    insert into T
    select '2006-11-08','好又多','中天','十年',100,2  union all    --加條上期
    select '2006-11-09','好又多','中天','八年',2,76  union all
    select '2006-11-09','好又多','中天','五年',1,35  union all
    select '2006-11-09','好又多','中天','白干',10,4.3  union allselect '2006-11-08','北京','岩口','九級',5,5 union all       --加條上期
    select '2006-11-09','北京','岩口','甲級',30,29.8 union all
    select '2006-11-10','北京','岩口','乙級',10,10                       --加條下期(不計算)GOdeclare @date datetime
    set @date='2006-11-09'   --設置查詢截止時間--求和,丟到temp_t1
    select rq,Fname,Cname,[本期]=sum(num),
      [上期]=(select sum(num) from T a where a.rq<=T.rq and a.Fname=T.Fname  and a.Cname=T.Cname ) 
    into temp_t1
     from T
     where rq=@date
     group by rq,Fname,Cname--行轉列,丟到temp_t2
    declare @sql varchar(8000)
    set @sql=''
    select @sql=@sql+',sum(case when Pname='''+Pname+''' then num else 0 end) as ['+Pname+'],
                                sum(case when Pname='''+Pname+''' then num*value else 0 end) as ['+Pname+'金額]' 
                  from T
                 group by Pname
    set @sql='select rq,Fname,Cname'+@sql+'  into temp_t2  from T  where rq='''+convert(varchar(10),@date,120)+''' group by rq,Fname,Cname'
    exec (@sql)--把動態行轉列的欄位名抓出來
    declare @col varchar(8000)
    set @col=''
    select @col=@col+','+[name]  from syscolumns where object_id('temp_t2')=id
    and [name] not in('rq','Fname','Cname')
    order by colid--將temp_t1和temp_t2合併
    exec( 'select t1.rq as [查詢日期],t1.Fname as [商超],t1.Cname as [分店],[本期], [上期],
    [本期排名]=(select count(*) from temp_t1 a where a.[本期]>=t1.[本期]),
    [上期排名]=(select count(*) from temp_t1 a where a.[上期]>=t1.[上期])'+@col+
    ' from temp_t1 t1 inner join temp_t2 t2 on t1.rq=t2.rq and t1.Fname=t2.Fname and t1.Cname=t2.Cname')--刪除測試環境
    drop table T, temp_t1,temp_t2GO
    查詢日期 商超 分店 本期 上期 本期排名 上期排名 乙級 乙級金額 九級 九級金額 八年 八年金額  十年 十年金額 五年 五年金額 甲級 甲級金額 白干 白干金額 
    -----------------------------------------------------------------------------------------
    2006-11-09 好又多 中天 13 113 2 1 0 .00 0 .00 2 152.00 0 .00 1 35.00 0 .00  10  43.00
    2006-11-09  北京  岩口 30  35 1 2 0 .00 0 .00 0    .00 0 .00 0   .00 30 894.00 0 .00
      

  7.   

    就SQL而言,应该不行.你可以在前台获取数据后自己修改.
      

  8.   

    dawugui:我测试了你的方法,能行.不过,后面多了商超名称和分店名称.
    另外:如果把上述结果按商超名称分类合计,最后一个总计(排名除外).
    在总计行下面再显示上期总计数..以作比较.麻烦了...
      

  9.   

    你只要將先前的統計做出來,
    然後加rollup就可以了
    比如你先前的統計,(記為#t)
    商超 分店 本日销量 累计销量 本日排行 累计排行 产品一销量 产品一金额 ...
    ----------------------------------------------------------------------------------
     好又多 中天 22    314    7    14      15    80    ...
      好又多  武侯   125      122        15      30           2         70      
      家乐福 光华  125    12548  22   1     225     33574
     家乐福 双桥  112    11554  2245 235    33     125--
    select 商超,分店,sum(本日销量),sum(累计销量)
    from #t
    group by 商超,分店 with rollup
      

  10.   

    看我以前上面寫的,將動態行轉列的內容丟到temp_t2,
    可以根據syscolumns來串
      

  11.   

    dawugui帅兄:你的那个过程还有个问题,如查把日期换到10号以后,比如16号.就不会有数据显示...