将“IF和NULL”从MySQL更改为SQL Server

将“IF和NULL”从MySQL更改为SQL Server,mysql,sql,sql-server,Mysql,Sql,Sql Server,我无法将查询从MySQL更改为SQL Server。我试图在SQL中将其更改为ISNULL和IIF,但仍然不起作用。欢迎任何提示或帮助,谢谢 问题1: MYSQL SQL Server 在问题2中使用COALESCE时出现的问题是,当表中没有值时,它不会显示“0”。SQL Server中的isnull函数与MySQL中的if函数不同,请改用用例运算符: SUM(case when r.group_status=1 then r.quantity else 0 end)) 在第二种情况下,看起来

我无法将查询从MySQL更改为SQL Server。我试图在SQL中将其更改为ISNULL和IIF,但仍然不起作用。欢迎任何提示或帮助,谢谢

问题1:

MYSQL

SQL Server

在问题2中使用COALESCE时出现的问题是,当表中没有值时,它不会显示“0”。

SQL Server中的isnull函数与MySQL中的if函数不同,请改用用例运算符:

SUM(case when r.group_status=1 then r.quantity else 0 end))
在第二种情况下,看起来您也不正确地使用了coalesce,因为它只是从参数中获取第一个NOTNULL值,并且它与MySQL if函数、用例操作符也不等价


另外,在第二种情况下,当没有结果时,您将不会得到0值-至少因为您已使用nullif对其进行了包装,并且当结果和为0时,它将输出null。因此,您的问题的这一部分确实需要澄清,可能需要源数据样本和所需的输出。

在您的第一次查询中,问题是

您不能使用“已批准”列给出的列给出单个报价 您的isnull条件错误isnull columnname,TexttoReplace

  SELECT i.item_name
 , r.item_version
 , SUM(ISNULL(r.group_status, 1))  AS Approved
 , SUM(ISNULL(r.group_status,2)) AS NotApproved
 , SUM(r.quantity)  AS Total
FROM requesters r
JOIN items i
  ON i.item_id = r.item_id
WHERE r.group_status IN (1,2)
AND r.requested_date >= '$a'
AND r.requested_date <= '$b'
GROUP
BY i.item_name
 , r.item_version

第二个疑问是理解不清楚。在数据中加上。

不要使用反引号SQLServer@festvender在第一个查询中,我认为您需要使用2个不同的数据集进行求和,在第二个查询中,您需要使用检查进行求和,如果没有值,则返回0。正当如果是,为什么要使用coalesce?我会更改它,以及如何解决“操作数数据类型varchar对求和运算符无效”的问题。出来了吗?@festvender将数据类型从文本更改为数字:sumcastvarchar列为int-或您想要的任何数字数据类型,如果您遇到这样的错误-这意味着您的r.quantity值已存储为数据库中的varchar数据类型。如果是有意的,那么只需使用castr.quantity作为int而不是r.quantity。但是一般来说,应该避免将数字存储为varchar。@AndyKorneyev它的工作方式是,但仍然不稳定,我想,你介意看一下吗,如果在这个问题上有任何错误,请让我知道。谢谢就我所见,您仍然在条件和中使用带case运算符的r.quantity,并在Total列中将其强制转换为int。在使用sum的每个地方都必须将其转换为int。或者,正如我已经说过的,只需将DB列类型从varchar更改为int。关于第二种情况,请看这里,当有十进制数时,我有问题。@festvender在您的示例中,您的价格列类型为varchar,但实际上在其中存储了十进制值。有什么原因吗?无论如何,如果您不能更改数据库结构,并且它强制您使用varchar作为价格-那么将COALESCEendusers.price,0更改为coalesceCastedUsers.price作为小数10,2,0.@AndyKorneyev如果我想更改数据库结构,还有什么数据类型适合我的情况?。例:200.97浮点数或数字18,2@festvender我不建议在财务计算中使用float数据类型,因为它是近似类型。使用小数x,y,其中x是数字的最大大小,y是精度。在你的特殊情况下,它是类似小数10、2或类似的东西。
SELECT IFNULL(SUM(IF(endusers.price,endusers.price,0)),0) AS `totalprice` 
FROM endusers
WHERE requester_code = '$req_code'
SELECT NULLIF(SUM(COALESCE(endusers.price,endusers.price,0)),0) AS 'totalprice' 
FROM endusers 
WHERE requester_code = '$req_code'
SUM(case when r.group_status=1 then r.quantity else 0 end))
  SELECT i.item_name
 , r.item_version
 , SUM(ISNULL(r.group_status, 1))  AS Approved
 , SUM(ISNULL(r.group_status,2)) AS NotApproved
 , SUM(r.quantity)  AS Total
FROM requesters r
JOIN items i
  ON i.item_id = r.item_id
WHERE r.group_status IN (1,2)
AND r.requested_date >= '$a'
AND r.requested_date <= '$b'
GROUP
BY i.item_name
 , r.item_version