【发布时间】:2016-04-27 15:48:14
【问题描述】:
我正在 SQL Server 中执行此查询,它工作正常,但是当我尝试在 Oracle 中执行它时,它没有给出相同的结果。
您可以在我附上的照片中看到一位客户的数据,他的代码为 1、2、4、8,他应该得到 0.70 的价值,因为他有代码 1,2,4,然后他应该得到代码 8得到 0.75,所以乘法后它应该返回 0.52 作为值。我在 Oracle 中通过用 nvl 替换 is null 进行了尝试,但它返回 1 而不是 0.52。请帮助我将此查询转换为 Oracle 支持的查询,该查询将返回相同的结果。
这是我的查询
SELECT [id] ,[name],r = isnull(nullif(
max(CASE WHEN [code] IN (1,2,4) then 0.70 else 0 end)
,0),1)
* isnull(nullif(
min(CASE WHEN [code] IN (1,2) then 0 else 1 end)
* max(CASE WHEN [code] IN (4) then 0.20 else 0 end)
,0),1)
* isnull(nullif(
max(CASE WHEN [code] IN (8) then 0.75 else 0 end)
,0),1)
FROM (values (1, 'ali',4)
,(1, 'ali',1)
,(1, 'ali',8)
,(1, 'ali',2)
,(2, 'sunny',1)
,(4, 'arslan',4)) as t(id, name,code)
GROUP BY id, name;
【问题讨论】:
-
为了理智,请重写这个查询,不要使用古老的连接语法。使用正确的 LEFT、INNER 或 CROSS JOINS,以适合您的应用程序。您在上面使用的连接是非常糟糕的做法。
-
如果你说
MAX(CASE WHEN RM_LIVE.CRWSPECFUNC.IDCRWSPECFUNC IN (31,723) THEN 0.75 ELSE 1 END)你会得到 1 而不是 0.75.. 你确定你已经在 sql 中计算出来了吗?似乎你所有的 ELSE 都应该是 0 而不是 1 -
@Rich Benner 忘记连接等,我所要做的就是通过将所有值与这些代码相乘来根据他们获得的代码给我的客户一些分数。假设如果有人得到代码 1、2、4 和 31,那么他应该得到 0.70 对应 1、2、4 和 0.75 对应代码 31,所以他的总价值将是 0.52。
-
@AlexK。让我编辑我的问题。我将发布一个没有任何屏幕截图的简单查询。
-
Rich 对您的加入是正确的。你在这里做的是非常糟糕的做法,把你的查询变成了一些难以理解的东西,只是没有给我任何学习和修复它的意愿。
标签: sql sql-server oracle tsql