表1:sp_jg              
fdbs spid hshjj
LYD  SP01  1
LYD  SP02  3
LYD  SP03  3
LYD  SP04  6
WHD  SO01  1.5
WHD  SP02  4
WHD  SP03  2.5
XAD  SP01  8
XAD  SP03  3
XAD  SP04  7
.....希望通过查询SPID得到结果如下效果:
spid   LYD  WHD  XAD
SP01  1    1.5   8
SP02  3    4     null
sp03  3    2.5   3
sp04  6    nul   7
.....

解决方案 »

  1.   

    select *
    from sp_jg
    pivot(max(hshjj) for fdbs in ([LYD],[WHD],[XAD])) a
      

  2.   

    SELECT  spid ,
            MAX(CASE WHEN fdbs = 'lyd' THEN hshjj
                     ELSE NULL
                END) lyd ,
            MAX(CASE WHEN fdbs = 'whd' THEN hshjj
                     ELSE NULL
                END) whd ,
            MAX(CASE WHEN fdbs = 'xad' THEN hshjj
                     ELSE NULL
                END) xad
    FROM    sp_jg
    GROUP BY spid
      

  3.   

    谢谢啊,搞定了,这里用了一个MAX,这不是最大的意思吗、
      

  4.   

    因为如果不符合条件我就赋值为null,所以加上max来减少重复。你可以不加max,就知道是什么结果了。
      

  5.   

    很不好意思,我还是那个问题哦。就上面那一个语句:MAX(CASE WHEN fdbs = 'lyd' THEN hshjj 此处的这个hshjj不是实在的字段而是一个函数生成:dbo.getfhj(d.spid,sum(b.shl),b.dw)把这个函数放里面,报错提示如图。这个函数是可以生成我所需要的fahuoj,这个语句要怎么写?具体表如下:
    pf_ckmx
    djbh(单据编号)spid(商品内码)dw(单位)shl(数量)fahuoj(发货计)
    XSALYD00056242  SPH00002227 个     10.00 10个                                    
    XSALYD00057046  SPH00002227 个     1.00 1个                                     
    XSAWHD00022011  SPH00004220 个     1.00
    XSAWHD00022063  SPH00003069 个     1.00 1个                                     
    XSAWHD00022063  SPH00003134 条     2.00 2条                                     
    XSAWHD00022068  SPH00004507 支     5.00 5支                                     
    XSAWHD00022068  SPH00003085 支     5.00 5支                                     
    XSAWHD00022068  SPH00003084 支     5.00 5支                                     
    XSAWHD00022068  SPH00002910 支     3.00 3支                                     
    XSAWHD00022072  SPH00003016 双     3.00 3双 
    ......                                
    表2:pf_ckhz
    djbh(单据编号)dwbh(单位编号)bendian(本店)
    XSALYD00056242  DWI00009982 LYD
    XSALYD00057046  DWI00009982 LYD
    XSAWHD00022011  DWI00005513 WHD
    XSAWHD00022063  DWI00006560 WHD
    XSAWHD00022068  DWI00006059 WHD
    XSAWHD00022072  DWI00005704 WHD
    XSAWHD00022073  DWI00005739 WHD
    XSAWHD00022074  DWI00005729 WHD
    XSAWHD00022082  DWI00006250 WHD
    XSAWHD00022093  DWI00006250 WHD
    .........
    表3:spkfk(此表为总表,包括所有的商品编号、内码、名称)
    spid(商品内码)spbh(商品编号)spmch(商品名称)dwshpgg(商品规格)
    SPH00000001 T090003006 0158P跳绳 条 1件*30扎*10条                           
    SPH00000002 W130201001 083调色盘 个 1件*20包*30个                           
    SPH00000003 W130201002 086调色盘 个 1件×24包×25个                         
    SPH00000004 W130201003 087调色盘 个 1件*18包*25个                           
    SPH00000005 T150701001 1.5KG铁饼 个 1个                                     
    SPH00000006 T150701006 1.5KG铁饼 个 1个                                     
    SPH00000007 B040303008 100CM钢直尺 支 1件×120支                              
    SPH00000008 T180001077 100KG电镀杠铃 付 1付                                     
    SPH00000009 Y050001004 昆仑10寸电铃 个 1件*6个                                 
    SPH00000010 T111204005 10KG沙背心 付 1件×5付  
    ......
     我最后的需要的结果就如下(求各个店的各个商品所卖的总数)
    spbh       spmch YWD(义乌店)WHD(武汉店)XAD(西安店)
    SPH00000001 0158P跳绳  n件n条 n件n条 ...
    SPH00000002 083调色盘  n件n个 ...    ...
    SPH00000003 086调色盘  n件n条 ...    ...
    SPH00000004 087调色盘  ...   ...
    SPH00000005 1.5KG铁饼  ...
    SPH00000006 1.5KG铁饼  ...
    ....            
    还需要什么条件,我再提供表        
      

  6.   

    你好,谢谢你的回复,得出来的结果没啥问题,但是你那里取的3.6.1.5.8.3.7,这些数据不只这么多,还有大批量的spid(商品编号),
      

  7.   

    其实上面的朋友都说得很好了,用pivot来实现!
    如:
    select * from (
    select * from test
    ) as oldTable
    pivot (
    count(1) from spid in (产品1,产品2,......)
    ) as pivottable如果你认为这类做法实现不了你的需求,比如说产品比较多,哪就用原始办法来实现,把所有spid查询出来,然后针对每个spid进行单独查询,只不过这样数据库操作就多了!