如何解决查询上的 SQL 到 R 的转换
所以我需要将查询从 SQL 转换为 R,但碰巧的是,我认为 R 中可用的功能有限。
SQL:
if object_id ('tempdb..#ProductCodingChanges') is not null drop table #ProductCodingChanges
SELECT p.ProdID as ID,p.ReverseSupplier as Supplier,p.ReverseProductCode as Code,p.Description,p.ReverseNDFProd AS [From NDFProd],p.ReverseNDFPack AS [From NDFPack],p.ReverseQuantityFactor AS [From QtyFct],l.description AS [From Description],p.EditNDFProd AS [To NDFProd],p.EditNDFPack AS [To NDFPack],p.EditQtyFct AS [To QtyFct],l1.description AS [To Description],cast(p.TotalEditUnits as varchar(max)) as [Total Edit Units],'$'+cast(p.EditValue as varchar(max)) as [Edit Value],'$'+cast(Cast(IIF(l.ATC LIKE 'W*',(p.TotalReversedUnits*l.price*-1))+IIF(l1.atc LIKE 'w*',(p.TotalEditUnits*l.price)) as money) as varchar(max)) AS APIdifference,'' AS Checked,p.ProdRecActive as Active
INTO #ProductCodingChanges
FROM (((#ProductCorrection AS p
LEFT JOIN ndf_061.[NDF_061].dbo.NDFLKUPKey AS k ON (p.ReverseNDFPack = k.pack_cd) AND (p.ReverseNDFProd = k.prod_cd))
LEFT JOIN ndf_061.[NDF_061].dbo.NDFLKUP AS l ON k.NDF = l.NDF)
LEFT JOIN ndf_061.[NDF_061].dbo.NDFLKUPKey AS k1 ON (p.EditNDFPack = k1.pack_cd) AND (p.EditNDFProd = k1.prod_cd))
LEFT JOIN ndf_061.[NDF_061].dbo.NDFLKUP AS l1 ON k1.NDF = l1.NDF
ORDER BY Abs(IIF(l.ATC LIKE 'W*',(p.TotalEditUnits*l.price))) DESC;
R:
ProductCodingChangesT <- sqldf("
SELECT p.ProdID as ID,l.Description AS [From Description],l1.Description AS [To Description],max(cast(p.TotalEditUnits as varchar)) as [Total Edit Units],'$'+max(cast(p.EditValue as varchar)) as [Edit Value],'$'+max(cast(Cast(IIF(l.ATC LIKE 'W*',(p.TotalReversedUnits*l.Price*-1))+IIF(l1.ATC LIKE 'w*',(p.TotalEditUnits*l.Price)) as money) as varchar)) AS APIdifference,p.ProdRecActive as Active
FROM (((ProductCorrectionT AS p
LEFT JOIN NDFLKUPTKeyT AS k ON (p.ReverseNDFPack = k.pack_cd) AND (p.ReverseNDFProd = k.prod_cd))
LEFT JOIN NDFLKUPT AS l ON k.NDF = l.NDF)
LEFT JOIN NDFLKUPTKeyT AS k1 ON (p.EditNDFPack = k1.pack_cd) AND (p.EditNDFProd = k1.prod_cd))
LEFT JOIN NDFLKUPT AS l1 ON k1.NDF = l1.NDF
ORDER BY Abs(IIF(l.ATC LIKE 'W*',(p.TotalEditUnits*l.Price))) DESC;")
出现错误,指出 IIF 没有功能。我被告知只是操纵它。
解决方法
您必须使用旧版本的 RSQLite。 RSQLite on CRAN 的版本有更高版本的 SQLite,它确实支持 iif
。
library(sqldf)
sqldf("select Time,iif(Time < 4,'a','b') Letter,demand from BOD")
## Time Letter demand
## 1 1 a 8.3
## 2 2 a 10.3
## 3 3 a 19.0
## 4 4 b 16.0
## 5 5 b 15.6
## 6 7 b 19.8
packageVersion("RSQLite")
## [1] ‘2.2.7’
sqldf("select sqlite_version()")
## sqlite_version()
## 1 3.35.5
,
感谢您对使用 case when 的评论。我现在可以将 IIF 更改为 Case When:
if object_id ('tempdb..#ProductCodingChanges') is not null drop table #ProductCodingChanges
SELECT p.ProdID as ID,p.ReverseSupplier as Supplier,p.ReverseProductCode as Code,p.Description,p.ReverseNDFProd AS [From NDFProd],p.ReverseNDFPack AS [From NDFPack],p.ReverseQuantityFactor AS [From QtyFct],l.description AS [From Description],p.EditNDFProd AS [To NDFProd],p.EditNDFPack AS [To NDFPack],p.EditQtyFct AS [To QtyFct],l1.description AS [To Description],cast(p.TotalEditUnits as varchar(max)) as [Total Edit Units],'$'+cast(p.EditValue as varchar(max)) as [Edit Value],'$'+cast(Cast(CASE l.ATC WHEN 'W*' THEN 0 ELSE (p.TotalReversedUnits*l.price*-1) END + CASE l1.atc WHEN 'w*' THEN 0 ELSE (p.TotalEditUnits*l.price) END as money) as varchar(max)) AS APIdifference,'' AS Checked,p.ProdRecActive as Active
INTO #ProductCodingChangesCase
FROM (((#ProductCorrection AS p
LEFT JOIN ndf_061.[NDF_061].dbo.NDFLKUPKey AS k ON (p.ReverseNDFPack = k.pack_cd) AND (p.ReverseNDFProd = k.prod_cd))
LEFT JOIN ndf_061.[NDF_061].dbo.NDFLKUP AS l ON k.NDF = l.NDF)
LEFT JOIN ndf_061.[NDF_061].dbo.NDFLKUPKey AS k1 ON (p.EditNDFPack = k1.pack_cd) AND (p.EditNDFProd = k1.prod_cd))
LEFT JOIN ndf_061.[NDF_061].dbo.NDFLKUP AS l1 ON k1.NDF = l1.NDF
ORDER BY Abs(CASE l.ATC WHEN 'W*' THEN 0 ELSE (p.TotalReversedUnits*l.price*-1) END + CASE l1.atc WHEN 'w*' THEN 0 ELSE (p.TotalEditUnits*l.price) END) DESC;
谢谢各位!对于不相关的标签也很抱歉。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。