T_A
cBrand          cGrade         cType           nQty
 仓A              A             生产            10
 仓B              B             盘盈            20
 仓C              C             生产            60
 仓B              B             直运            80
 仓A              A             直运            20
 仓A              A             生产            50
 仓B              B             直运            20
 仓C              A             生产            60生成以下表
cBrand   A     A     A     B     B     B     C     C      C
       生产  盘盈  直运  生产  盘盈  直运  生产  盘盈   直运
 仓A    60          20
 仓B                            20   100
 仓C    60                                  60

解决方案 »

  1.   

    看看這樣的結果能不能接受Create Table T_A
    (cBrand Nvarchar(10),
     cGrade Char(1),
     cType Nvarchar(10),
     nQty Int)
    Insert T_A Select  N'仓A',              'A',             N'生产',            10
    Union All Select  N'仓B',              'B',             N'盘盈',            20
    Union All Select  N'仓C',              'C',             N'生产',            60
    Union All Select  N'仓B',              'B',             N'直运',            80
    Union All Select  N'仓A',              'A',             N'直运',            20
    Union All Select  N'仓A',              'A',             N'生产',            50
    Union All Select  N'仓B',              'B',             N'直运',            20
    Union All Select  N'仓C',              'A',             N'生产',            60
    Go
    Declare @S Nvarchar(4000)
    Set @S=''
    Select @S=@S+',SUM(Case When cGrade='''+cGrade+''' And cType=N'''+cType+''' Then nQty Else 0 End) As '+cGrade+cType
    From (Select Distinct A.cGrade,B.cType From T_A A,T_A B) A Order By cGrade,cType
    Select @S='Select cBrand'+@S+' From T_A Group By cBrand Order By cBrand'
    EXEC(@S)
    GO
    Drop Table T_A
    --Result
    /*
    cBrand A生产 A直运 A盘盈 B生产 B直运 B盘盈 C生产 C直运 C盘盈
    仓A 60 20 0 0 0 0 0 0 0
    仓B 0 0 0 0 100 20 0 0 0
    仓C 60 0 0 0 0 0 60 0 0
    */
      

  2.   

    declare @s varchar(8000)
    select @s='select cBrand'
    select @s=@s+',['+cGrade+cType+']=sum(case when cGrade='''+cGrade+''' and cType='''+cType+''' then nQty else 0 end)' from T_A group by cGrade,cType
    exec(@s+' from t_a group by cBrand')
      

  3.   

    itblog,你的查詢少了很多列的。
      

  4.   

    Declare @sql varchar(8000)
    set @sql='select cBrand'
    select @sql=@sql+','+cGrade+cType+'=sum(case when cGrade='''+cGrade+''' then nqty else 0 end)' from T_A order by cgrade
    select @sql
    exec (@sql+ ' from T_A group by cbrand order by cbrand')
      

  5.   

    没办法,水平还是比较差,慢了许多.
    ---------------------------------------------------------------------------------
    if exists(select * from sysobjects where name='T_A' and xtype='U') drop table T_A
    GO
    --生成测试用数据,为SELECT初始环境
    CREATE TABLE T_A(cBrand varchar(10),cGrade varchar(10),cType varchar(10),nQty int)
    insert T_A select '仓A','A','生产',10
    union all select '仓B','B','盘盈',20
    union all select '仓C','C','生产',60
    union all select '仓B','B','直运',80
    union all select '仓A','A','直运',20
    union all select '仓A','A','生产',50
    union all select '仓B','B','直运',20
    union all select '仓C','A','生产',60--select * from T_A
    GO
    /*--  此处为用来查询的SELECT语句 --*/
    Declare @sql varchar(8000)
    set @sql='select cBrand'
    /*1.使用動態查詢方式生成列,查看效果
    select @sql=@sql+','+cGrade+cType+'=case when cGrade='''+cGrade+''' then nqty else 0 end' from T_A order by cgrade
    exec (@sql+ ' from T_A ')
    */
    --2.由于需要進行分類統計,在上面的測試語句中加上sum(),并在exec( 中加入 group by 
    select @sql=@sql+','+cGrade+cType+'=sum(case when cGrade='''+cGrade+''' then nqty else 0 end)' from T_A order by cgrade--group by cgrade
    select @sql
    exec (@sql+ ' from T_A group by cbrand order by cbrand')
    GO
    --删除测试散数据
    DROP TABLE T_A/* -- 结果 --
    cBrand     A生产         A直运         A生产         A生产         B直运         B直运         B盘盈         C生产         
    ---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 
    仓A         80          80          80          80          0           0           0           0
    仓B         0           0           0           0           120         120         120         0
    仓C         60          60          60          60          0           0           0           60
    */ -- 完成 --
      

  6.   

    -- sql 2005Create Table T_A
    (cBrand Nvarchar(10),
     cGrade Char(1),
     cType Nvarchar(10),
     nQty Int)
    Insert T_A Select  N'仓A',              'A',             N'生产',            10
    Union All Select  N'仓B',              'B',             N'盘盈',            20
    Union All Select  N'仓C',              'C',             N'生产',            60
    Union All Select  N'仓B',              'B',             N'直运',            80
    Union All Select  N'仓A',              'A',             N'直运',            20
    Union All Select  N'仓A',              'A',             N'生产',            50
    Union All Select  N'仓B',              'B',             N'直运',            20
    Union All Select  N'仓C',              'A',             N'生产',            60
    GoSELECT *
    FROM(
    SELECT cBrand, FD = RTRIM(cGrade) + '_' + RTRIM(cType), nQty
    FROM T_A
    )DATA
    PIVOT(
    SUM(nQty)
    FOR FD IN([A_生产], [A_直运], [A_盘盈], [B_生产], [B_直运], [B_盘盈], [C_生产], [C_直运], [C_盘盈])
    )P
    GODROP TABLE T_A-- 结果:
    cBrand     A_生产        A_直运        A_盘盈        B_生产        B_直运        B_盘盈        C_生产        C_直运        C_盘盈
    ---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
    仓A         60          20          NULL        NULL        NULL        NULL        NULL        NULL        NULL
    仓B         NULL        NULL        NULL        NULL        100         20          NULL        NULL        NULL
    仓C         60          NULL        NULL        NULL        NULL        NULL        60          NULL        NULL
      

  7.   

    wwh999(印钞机的卖 V2.0...发梦ing) ,你得到的結果有明顯的錯誤。
      

  8.   

    上面的错了,case里面的条件应该有两个,现改正..
    -------------------------------------------------------------
    if exists(select * from sysobjects where name='T_A' and xtype='U') drop table T_A
    GO
    --生成测试用数据,为SELECT初始环境
    CREATE TABLE T_A(cBrand varchar(10),cGrade varchar(10),cType varchar(10),nQty int)
    insert T_A select '仓A','A','生产',10
    union all select '仓B','B','盘盈',20
    union all select '仓C','C','生产',60
    union all select '仓B','B','直运',80
    union all select '仓A','A','直运',20
    union all select '仓A','A','生产',50
    union all select '仓B','B','直运',20
    union all select '仓C','A','生产',60--select distinct A.cgrade,B.ctype from T_A A,T_A B 
    GO
    /*--  此处为用来查询的SELECT语句 --*/
    Declare @sql varchar(8000)
    set @sql='select cBrand'
    /*1.使用動態查詢方式生成列,查看效果
    select @sql=@sql+','+cGrade+cType+'=case when cGrade='''+cGrade+''' then nqty else 0 end' from T_A order by cgrade
    exec (@sql+ ' from T_A ')
    */
    --2.由于需要進行分類統計,在上面的測試語句中加上sum(),并在exec( 中加入 group by 
    select @sql=@sql+','+cGrade+cType+'=sum(case when cGrade='''+cGrade+''' and  cType='''+cType+''' then nqty else 0 end)'
    from (select distinct A.cgrade,B.ctype from T_A A,T_A B )A order by cgrade,ctype
    select @sql
    exec (@sql+ ' from T_A group by cbrand order by cbrand')GO
    --删除测试散数据
    DROP TABLE T_A/* -- 结果 --
    cBrand     A盘盈         A生产         A直运         B盘盈         B生产         B直运         C盘盈         C生产         C直运         
    ---------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 
    仓A         0           60          20          0           0           0           0           0           0
    仓B         0           0           0           20          0           100         0           0           0
    仓C         0           60          0           0           0           0           0           60          0*/ -- 完成 -----------------------------------------
    唉,偶不仅慢,还错呢!...鱼,学习了....
      

  9.   

    fs_hzj() ( ) 信誉:100  2006-06-12 10:18:00  得分: 0  
     
     
       谢谢,再问一下,加上合计项该如何实现?
      
     
    -----------------------------------------------
    怎樣的合計,貼出你要的結果看看。
      

  10.   

    最终实现如下,如不够,可加分...刚才的查询测试记录为了1000条,用时为5S...
    T_A
    cBrand          cGrade         cType           nQty
     仓A              A             生产            10
     仓B              B             盘盈            20
     仓C              C             生产            60
     仓B              B             直运            80
     仓A              A             直运            20
     仓A              A             生产            50
     仓B              B             直运            20
     仓C              A             生产            60
     仓A              A             领出            10
     仓A              A             盘亏            20
    生成以下表
    cBrand   A     A     A     B     B     B     C     C      C     A    A     存  存 存
           生产  盘盈  直运  生产  盘盈  直运  生产  盘盈   直运  领出  盘亏   A   B  C
     仓A    60          20                                         10    20    50
     仓B                            20   100
     仓C    60                                  60
     合计   120         20          20   100    60                 10    20    50
      

  11.   

    生成以下表  
    cBrand    A    A    A    B    B    B    C    C    C    A    A   A  B  C  
             生产 盘盈 直运 生产 盘盈 直运 生产 盘盈 直运 领出 盘亏 存 存 存
     仓A     60         20                                 10   20  50
     仓B                          20  100  
     仓C     60                             60  
     合计   120         20        20  100   60             10   20  50  
      

  12.   

    太长,发了几次都变成这样子,不好意思生成以下表  
    cBrand    A    A    A    B    B    B    C    C    C    A    A   A  B   C  
             生产 盘盈 直运 生产 盘盈 直运 生产 盘盈 直运 领出 盘亏 存 存  存
     仓A     60    0    20   0   0     0   0    0     0    10   20  50  0  0
     仓B     0     0    0    0   20  100   0    0     0     0   0   0  120 0   
     仓C     60    0    0    0   0     0   60   0     0     0   0   0   0  60
     合计   120    0    20   0   20  100   60   0     0    10   20  50 120 60
      

  13.   

    上面的A  A  A  B  C最后五个列,跟你提供的数据好像没什么关系吧...看不明白...
      

  14.   

    最后五个列是这样的...
       A     A     A   B   C
      领出 盘亏  存  存  存
      10    20   50存50是这样计算的:A存=A生产+A盘盈+A直运-A领出-A盘亏
      

  15.   

    T_A
    cBrand          cGrade         cType           nQty
     仓A              A             生产            10
     仓B              B             盘盈            20
     仓C              C             生产            60
     仓B              B             直运            80
     仓A              A             直运            20
     仓A              A             生产            50
     仓B              B             直运            20
     仓C              A             生产            60
     仓A              A             领出            10
     仓A              A             盘亏            20
    在上面的表记录有...
      

  16.   

    T_A
    cBrand          cGrade         cType           nQty
     仓A              A             生产            10
     仓B              B             盘盈            20
     仓C              C             生产            60
     仓B              B             直运            80
     仓A              A             直运            20
     仓A              A             生产            50
     仓B              B             直运            20
     仓C              A             生产            60
     仓A              A             领出            10
     仓A              A             盘亏            20生成以下表
    cBrand   A     A     A     B     B     B     C     C      C     A    A     A   B   C
            生产  盘盈  直运  生产  盘盈  直运  生产  盘盈   直运  领出  盘亏  存  存  存
     仓A    60          20                                         10    20    50
     仓B                            20   100
     仓C    60                                  60
     合计   120         20          20   100    60                 10    20    50
      

  17.   

    请再帮忙解答一下:
    T_A
    cBrand          cGrade         cType         nQty
     仓A              A             生产            10
     仓B              B             盘盈            20
     仓C              C             生产            60
     仓B              B             直运            80
     仓A              A             直运            20
     仓A              A             生产            50
     仓B              B             直运            20
     仓C              A             生产            60
     仓A              A             领出            10
     仓A              A             盘亏            20生成以下表
    cBrand A     A   A    B    B    B     C    C    C   A    A    A   B    C
          生产 盘盈 直运 生产 盘盈 直运 生产 盘盈 直运 领出 盘亏  存  存   存
     仓A   60      20                                    10  20   50
     仓B                       20  100                                120
     仓C   60                           60                        60       60
     合计  120     20          20   100 60               10  20   90  120  60
      

  18.   

    C存=C生产+C盘盈+C直运-A领出-A盘亏??你只顯示了A的领出,盘亏,B、C的呢??查詢結果中不用顯示嗎?
      

  19.   

    没有发生就不显示,也就是说cGrade与cType是动态的...
      

  20.   

    我认为:
      这样的逻辑,应该是开发语言中来写,而不是在通过SQL完成。
      

  21.   

    哦,不好意思,可能整理得不够清淅,再整理一下
    T_A
    cBrand          cGrade         cType           nQty
     仓A              A             生产            10
     仓C              C             生产            60
     仓B              B             直运            80
     仓A              C             盘盈            10
     仓A              A             直运            20
     仓A              A             生产            50
     仓B              B             直运            20
     仓C              A             生产            60
     仓A              A             领出           -10
     仓A              C             盘亏           -20
     仓B              A             领出           -30
    生成以下表
    cBrand A    A    B    C    C    C    A    A    C    A   B    C
          生产 直运 直运 生产 盘盈 直运 领出 盘亏 领出  存  存  存
     仓A   60   20             10       -10  -20  -30   50  0   -30
     仓B            100        20  100  -30             -30 100 120
     仓C   60             60                            60       60
     合计  120  20  100   60   30  100  -40  -20  -30   80  100 150  
      

  22.   

    请你把表格对好点咯,
    cBrand A    A    B    C    C    C    A    A    C    A   B    C
          生产 直运 直运 生产 盘盈 直运 领出 盘亏 领出  存  存  存
     仓A   60   20             10       -10  -20  -30   50  0   -30
     仓B            100        20  100  -30             -30 100 120
     仓C   60             60                            60       60
     合计  120  20  100   60   30  100  -40  -20  -30   80  100 150  这是什么跟什么啊,乱78糟,
      

  23.   

    declare @s varchar(8000)
    set @s = ''
    select @s = @s + ',' + cgrade + '_' +  ctype + ' = sum(case when cGrade = ''' + cGrade + ''' and cType = ''' +cType + ''' then nQty else 0 end )' 
    from t_a group by cgrade,ctype
    print @sselect @s = 'select cBrand ' + @s + ' from t_a group by cBrand'
    exec(@s)