case when条件一样,但数值转换结果不一样。

oplopl2 2018-05-12 02:54:56
ERP系统所有产品采购数量小数位都是10位,现想对产品是B线产品的,改为整数。这种实际上都是整数,其它原材料是有小数位的。

语句如下,条件一样,结果不一样。此条件想得到的数据是无小数位的。
SELECT
(case when ( SELECT count(u_buyTaskMx.MtrlID) FROM u_buyTaskMx inner join u_mtrldef on u_buyTaskMx.MtrlID=u_mtrldef.mtrlid WHERE u_mtrldef.mtrlid in (select mtrlid from u_mtrldef where handtype like 'B线产品>>B%') and u_buyTaskMx.TaskID =27395 ) >0
--then cast(u_buyTaskMx.uqty AS int ) ELSE cast(u_buyTaskMx.uqty AS decimal(10,2) ) end ) as uqty
then cast(u_buyTaskMx.uqty AS int ) ELSE 8 end ) as uqty
FROM u_buyTaskMx WHERE u_buyTaskMx.TaskID =27395

执行结果是cast(u_buyTaskMx.uqty AS int ) ,无小数位

SELECT
(case when ( SELECT count(u_buyTaskMx.MtrlID) FROM u_buyTaskMx inner join u_mtrldef on u_buyTaskMx.MtrlID=u_mtrldef.mtrlid
WHERE u_mtrldef.mtrlid in (select mtrlid from u_mtrldef where handtype like 'B线产品>>B%') and u_buyTaskMx.TaskID =27395 ) >0
then cast(u_buyTaskMx.uqty AS int ) ELSE cast(u_buyTaskMx.uqty AS decimal(10,2) ) end ) as uqty
--then cast(u_buyTaskMx.uqty AS int ) ELSE 8 end ) as uqty
FROM u_buyTaskMx WHERE u_buyTaskMx.TaskID =27395
同样的条件,执行结果是cast(u_buyTaskMx.uqty AS decimal(10,2) )

帮忙看下,或者是否有别的语句可以实现

...全文
1958 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
oplopl2 2018-05-17
  • 打赏
  • 举报
回复
一列拆开就二列,就没意义了。本来是按订单来的,不会说一个订单里会有2种情况的。
shinger126 2018-05-16
  • 打赏
  • 举报
回复
引用 8 楼 oplopl2 的回复:
[quote=引用 7 楼 shinger126 的回复:] 楼主,你的SQL脚本写的太复杂了,谁写的?拖出来打死!这个可读性好差的。粗略看了一下,你们是意图判断表u_buyTaskMx中有没有B线产品并且TaskID =27395的记录,然后把其uqty值转换为整数型对吧
目的:ERP系统所有产品采购数量小数位都是10位,现想对产品是B线产品的,改为整数。这种实际上都是整数,其它原材料是有小数位的。 TaskID =27395 是B线产品,所以用这个ID来测试的。 [/quote] SELECT CAST(a.u_buyTaskMx.uqty AS int) uqty FROM u_buyTaskMx a JOIN u_mtrldef b ON a. u_buyTaskMx.MtrlID=b.u_mtrldef.mtrlid WHERE b.handtype like 'B线产品>>B%' AND a. u_buyTaskMx.TaskID =27395 这样查试试
oplopl2 2018-05-16
  • 打赏
  • 举报
回复
引用 6 楼 RINK_1 的回复:
你看看以下语句有结果吗,结果是你想进行修改的数据吗?

select * 
from u_buyTaskMx A
join u_mtrldef B on A.MtrlID=B.mtrlid
where B.handtype like 'B线产品>>B%' 
and A.TaskID =27395
目的:ERP系统所有产品采购数量小数位都是10位,现想对产品是B线产品的,改为整数。这种实际上都是整数,其它原材料是有小数位的。 TaskID =27395 是B线产品,所以用这个ID来测试的。 你这个没对原有的10位小数进行处理,没意义
oplopl2 2018-05-16
  • 打赏
  • 举报
回复
引用 7 楼 shinger126 的回复:
楼主,你的SQL脚本写的太复杂了,谁写的?拖出来打死!这个可读性好差的。粗略看了一下,你们是意图判断表u_buyTaskMx中有没有B线产品并且TaskID =27395的记录,然后把其uqty值转换为整数型对吧
目的:ERP系统所有产品采购数量小数位都是10位,现想对产品是B线产品的,改为整数。这种实际上都是整数,其它原材料是有小数位的。 TaskID =27395 是B线产品,所以用这个ID来测试的。
shinger126 2018-05-16
  • 打赏
  • 举报
回复
引用 11 楼 oplopl2 的回复:
[quote=引用 10 楼 shinger126 的回复:] [quote=引用 8 楼 oplopl2 的回复:] [quote=引用 7 楼 shinger126 的回复:] 楼主,你的SQL脚本写的太复杂了,谁写的?拖出来打死!这个可读性好差的。粗略看了一下,你们是意图判断表u_buyTaskMx中有没有B线产品并且TaskID =27395的记录,然后把其uqty值转换为整数型对吧
目的:ERP系统所有产品采购数量小数位都是10位,现想对产品是B线产品的,改为整数。这种实际上都是整数,其它原材料是有小数位的。 TaskID =27395 是B线产品,所以用这个ID来测试的。 [/quote] SELECT CAST(a.u_buyTaskMx.uqty AS int) uqty FROM u_buyTaskMx a JOIN u_mtrldef b ON a. u_buyTaskMx.MtrlID=b.u_mtrldef.mtrlid WHERE b.handtype like 'B线产品>>B%' AND a. u_buyTaskMx.TaskID =27395 这样查试试[/quote] 这样得到的是整数,但如果不是 'B线产品>>B%' 产品,就不对了,不适合。所以要case判断[/quote] 我觉得你们应该改变一下思路,因为同一个列不可能用2种数据类型。把一列分拆为2列来搞 SELECT CASE WHEN b.handtype like 'B线产品>>B%' THEN CAST(a.u_buyTaskMx.uqty AS int) ELSE 0 end uqty_b, --b线产品数量 CASE WHEN b.handtype like 'B线产品>>B%' THEN 0 ELSE a.u_buyTaskMx.uqty END uqty --其他产品数量 FROM u_buyTaskMx a JOIN u_mtrldef b ON a. u_buyTaskMx.MtrlID=b.u_mtrldef.mtrlid
shinger126 2018-05-16
  • 打赏
  • 举报
回复
楼楼,你们这样搞是不行的,同一个列里面,不可能一部分为int型一部分为小数型数据的,你试下就知道了 ;WITH t AS (SELECT CAST(3.14 AS numeric(10,2)) AS val UNION ALL SELECT 4.00) SELECT CASE WHEN val=4 then CAST(val AS INT) else val END FROM t
zbdzjx 2018-05-16
  • 打赏
  • 举报
回复
没看懂楼主的疑问,是第二条SQL语句的结果有小数?按第二条SQL语句的写法,结果肯定会有小数啊。
oplopl2 2018-05-16
  • 打赏
  • 举报
回复
引用 10 楼 shinger126 的回复:
[quote=引用 8 楼 oplopl2 的回复:] [quote=引用 7 楼 shinger126 的回复:] 楼主,你的SQL脚本写的太复杂了,谁写的?拖出来打死!这个可读性好差的。粗略看了一下,你们是意图判断表u_buyTaskMx中有没有B线产品并且TaskID =27395的记录,然后把其uqty值转换为整数型对吧
目的:ERP系统所有产品采购数量小数位都是10位,现想对产品是B线产品的,改为整数。这种实际上都是整数,其它原材料是有小数位的。 TaskID =27395 是B线产品,所以用这个ID来测试的。 [/quote] SELECT CAST(a.u_buyTaskMx.uqty AS int) uqty FROM u_buyTaskMx a JOIN u_mtrldef b ON a. u_buyTaskMx.MtrlID=b.u_mtrldef.mtrlid WHERE b.handtype like 'B线产品>>B%' AND a. u_buyTaskMx.TaskID =27395 这样查试试[/quote] 这样得到的是整数,但如果不是 'B线产品>>B%' 产品,就不对了,不适合。所以要case判断
shinger126 2018-05-14
  • 打赏
  • 举报
回复
楼主,你的SQL脚本写的太复杂了,谁写的?拖出来打死!这个可读性好差的。粗略看了一下,你们是意图判断表u_buyTaskMx中有没有B线产品并且TaskID =27395的记录,然后把其uqty值转换为整数型对吧
二月十六 2018-05-13
  • 打赏
  • 举报
回复
把那个语句直接写成8试试结果
oplopl2 2018-05-13
  • 打赏
  • 举报
回复
结果是8条数据
RINK_1 2018-05-13
  • 打赏
  • 举报
回复
你看看以下语句有结果吗,结果是你想进行修改的数据吗?

select * 
from u_buyTaskMx A
join u_mtrldef B on A.MtrlID=B.mtrlid
where B.handtype like 'B线产品>>B%' 
and A.TaskID =27395
oplopl2 2018-05-13
  • 打赏
  • 举报
回复
引用 4 楼 sinat_28984567 的回复:
把那个语句直接写成8试试结果
SELECT (case when ( SELECT count(u_buyTaskMx.MtrlID) FROM u_buyTaskMx inner join u_mtrldef on u_buyTaskMx.MtrlID=u_mtrldef.mtrlid WHERE u_mtrldef.mtrlid in (select mtrlid from u_mtrldef where handtype like 'B线产品>>B%') and u_buyTaskMx.TaskID =27395 ) >0 --then cast(u_buyTaskMx.uqty AS int ) ELSE cast(u_buyTaskMx.uqty AS decimal(10,2) ) end ) as uqty then cast(u_buyTaskMx.uqty AS int ) ELSE 8 end ) as uqty FROM u_buyTaskMx WHERE u_buyTaskMx.TaskID =27395 count(u_buyTaskMx.MtrlID) 有数据,则结果是cast(u_buyTaskMx.uqty AS int ) ,无小数位 count(u_buyTaskMx.MtrlID) 无数据,则结果直接等于8了 都试过的
oplopl2 2018-05-12
  • 打赏
  • 举报
回复
结果是 8
二月十六 2018-05-12
  • 打赏
  • 举报
回复
把这个值select出来,看看到底是什么
SELECT COUNT(u_buyTaskMx.MtrlID)
                FROM u_buyTaskMx
                    INNER JOIN u_mtrldef
                        ON u_buyTaskMx.MtrlID = u_mtrldef.mtrlid
                WHERE u_mtrldef.mtrlid IN (
                                              SELECT mtrlid FROM u_mtrldef WHERE handtype LIKE 'B线产品>>B%'
                                          )
                      AND u_buyTaskMx.TaskID = 27395

594

社区成员

发帖
与我相关
我的任务
社区描述
提出问题
其他 技术论坛(原bbs)
社区管理员
  • community_281
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧