if QTY>1 then 10 
if QTY>10 then 20
........
十位的时候十进
if QTY>100 then 200
.....
百位的时候百进
if QTY>1000 then 2000
.....
千位的时候千进
请问上面的语句如何用SQL语句实现

解决方案 »

  1.   

    举写数据来看看,感觉你这么用case when分别写就行了.
      

  2.   

    case when不行
    case QTY>1 then 10 最多只能套十个
    现在要求每个QTY值都进行进位
      

  3.   

    写的不太明白..这么简单用CASE WHEN不就好了?
      

  4.   

    实例 
    求FQTY
    表A
    PName      QTY       FQTY
    A          1         10
    B          11        20
    C          23        30
    A          101       200
    .........
    B          1100      2000
    C          3999      4000
      

  5.   

    SELECT CASE  WHEN  QTY>1 then 10
                               WHEN  QTY>10 then 20
                               WHEN QTY>100 then 200
                               WHEN  QTY>1000 then 2000 
                 END
    FROM TB
      

  6.   

    --你可以把后面的写完,就是>10000,>1000000....create table tb(PName varchar(10) ,    QTY  int,    FQTY int)
    insert into tb values('A' ,         1      ,  0) 
    insert into tb values('B' ,         11     ,  0)
    insert into tb values('C' ,         23     ,  0)
    insert into tb values('A' ,         101    ,  0)
    insert into tb values('B' ,         1100   ,  0)
    insert into tb values('C' ,         3999   ,  0)
    goselect pname,qty , 
      case when qty/10 = 0 then qty
           when qty/10 > 0 and qty/10 < 10 then (qty/10+1) * 10
           when qty/100 = 0 then qty
           when qty/100 > 0 and qty/100 < 10 then (qty/100+1) * 100
           when qty/1000 = 0 then qty
           when qty/1000 > 0 and qty/1000 < 10 then (qty/1000+1) * 1000
      end as FQT
    from tbdrop table tb/*
    pname      qty         FQT         
    ---------- ----------- ----------- 
    A          1           1
    B          11          20
    C          23          30
    A          101         200
    B          1100        2000
    C          3999        4000(所影响的行数为 6 行)
    */
      

  7.   

    取整的范围太多
    套嵌case语句来一个个判断行不通
      

  8.   

    --这样应该够用了吧,不够自己再加.create table tb(PName varchar(10) ,    QTY  int,    FQTY int)
    insert into tb values('A' ,         1      ,  0) 
    insert into tb values('B' ,         11     ,  0)
    insert into tb values('C' ,         23     ,  0)
    insert into tb values('A' ,         101    ,  0)
    insert into tb values('B' ,         1100   ,  0)
    insert into tb values('C' ,         3999   ,  0)
    insert into tb values('C' ,         39999  ,  0)
    insert into tb values('C' ,         399900 ,  0)
    goselect pname,qty , 
      case when qty/10        >= 0 and qty/10        < 10 then (qty/10+1)        * 10
           when qty/100       >= 0 and qty/100       < 10 then (qty/100+1)       * 100
           when qty/1000      >= 0 and qty/1000      < 10 then (qty/1000+1)      * 1000
           when qty/10000     >= 0 and qty/10000     < 10 then (qty/10000+1)     * 10000
           when qty/100000    >= 0 and qty/100000    < 10 then (qty/100000+1)    * 100000
           when qty/1000000   >= 0 and qty/1000000   < 10 then (qty/1000000+1)   * 1000000
           when qty/10000000  >= 0 and qty/10000000  < 10 then (qty/10000000+1)  * 10000000
           when qty/100000000 >= 0 and qty/100000000 < 10 then (qty/100000000+1) * 100000000
      end as FQT
    from tbdrop table tb/*
    pname      qty         FQT         
    ---------- ----------- ----------- 
    A          1           10
    B          11          20
    C          23          30
    A          101         200
    B          1100        2000
    C          3999        4000
    C          39999       40000
    C          399900      400000(所影响的行数为 8 行)
    */
      

  9.   

    不过位数太多时,使用bigint型,可以到16个case when,应该够你用的了.
      

  10.   

    --建立測試數據
    CREATE TABLE A(PName NVARCHAR(10),QTY INT)
    INSERT INTO A(PName ,QTY)
    SELECT 'A',1 UNION ALL
    SELECT 'B',11 UNION ALL
    SELECT 'C',23 UNION ALL
    SELECT 'A',101 UNION ALL
    SELECT 'B',1100 UNION ALL
    SELECT 'C',3999 UNION ALL
    SELECT 'B',11000 UNION ALL
    SELECT 'C',39990 UNION ALL
    SELECT 'B',110000 UNION ALL
    SELECT 'C',399900
    GO
    --查詢數據
    SELECT PName,QTY,FQTY=
    (CASE 
    WHEN QTY>0 AND QTY<=10 THEN CEILING(QTY/10.0)*10
    WHEN QTY>10 AND QTY<=100 THEN CEILING(QTY/10.0)*10
    WHEN QTY>100 AND QTY<=1000 THEN CEILING(QTY/100.0)*100
    WHEN QTY>1000 AND QTY<=10000 THEN CEILING(QTY/1000.0)*1000
    WHEN QTY>10000 AND QTY<=100000 THEN CEILING(QTY/10000.0)*10000
    WHEN QTY>100000 AND QTY<=1000000 THEN CEILING(QTY/100000.0)*100000
    END)
    FROM A
    GO
    --刪除測試數據
    DROP TABLE A
    GO
    /*查詢結果:
    (10 個資料列受到影響)
    PName      QTY         FQTY
    ---------- ----------- ---------------------------------------
    A          1           10
    B          11          20
    C          23          30
    A          101         200
    B          1100        2000
    C          3999        4000
    B          11000       20000
    C          39990       40000
    B          110000      200000
    C          399900      400000(10 個資料列受到影響)
    */
      

  11.   

    那你可以考慮寫一個函數,該函數能根據給出的數判斷出是多少位的數並返回1*權值,這樣的話一個CASE都不用了。
    不過那樣比這個CASE好像更麻煩!
      

  12.   

    用函数的方法
    create table tb(PName varchar(10) ,    QTY  int,    FQTY int)
    insert into tb values('A' ,         1      ,  0) 
    insert into tb values('B' ,         11     ,  0)
    insert into tb values('C' ,         23     ,  0)
    insert into tb values('A' ,         101    ,  0)
    insert into tb values('B' ,         1100   ,  0)
    insert into tb values('C' ,         3999   ,  0)
    gocreate function fint(@s bigint) returns bigint 
    as
    begin
    declare @i bigint,@r bigint
    set @i=1
    set @r=1
    while @i<len(@s)
    begin
    set @r=@r*10
    set @i=@i+1
    end
    if @r<>@S
    set @r=(@s/@r+1)*@r
    return @r
    end
    goselect pname,qty,fqt=dbo.fint(qty) from tbdrop table tb
    drop function fint/*
    pname      qty         fqt
    ---------- ----------- --------------------
    A          1           1
    B          11          20
    C          23          30
    A          101         200
    B          1100        2000
    C          3999        4000
    */
      

  13.   

    select case when Qty<10 then 10 else ceiling(Qty*1.0/power(10,len(Qty)-1))*power(10,len(Qty)-1) end ,* from #a