sqldf 仅返回一行,与 SQL 中使用的查询相同
sqldf only returning one row, same query used in SQL
出于某种原因,当涉及到 R 时,我只返回一行,而在 SQL 服务器上,我返回正确的行数。
SQL东风:
CustomerCodingChangesT <- sqldf("
SELECT c.CustID as ID
, c.ReverseSupplier as Supplier
, c.ReverseCustomerCode as Code
, c.Name
, c.Address
, c.[From PostCode]
, c.[From Outlet]
, c.[From OutletName]
, o.FullAddress AS [From Address]
, c.[To PostCode]
, c.[To Outlet]
, c.[To OutletName]
, o1.FullAddress AS [To Address]
, MAX(CAST(c.TotalUnits AS VARCHAR)) AS [Total Units]
, '$'+MAX(CAST(c.TotalValue AS VARCHAR)) AS [Total Value]
, '' AS Checked
, c.CustRecActive as Active
FROM CustomerCorrectionSummaryT AS c
LEFT JOIN OutletMasterT AS o
ON c.[From PostCode] = o.Postcode
AND c.[From Outlet] = o.Outlet
LEFT JOIN OutletMasterT AS o1
ON c.[To PostCode] = o1.Postcode
AND c.[To Outlet] = o1.Outlet
ORDER BY c.totalvalue DESC;")
SQL:
if object_id ('tempdb..#CustomerCodingChanges') is not null drop table #CustomerCodingChanges
SELECT c.CustID as ID
, c.ReverseSupplier as Supplier
, c.ReverseCustomerCode as Code
, c.Name
, c.Address
, c.[From Postcode]
, c.[From Outlet]
, c.[From OutletName]
, o.FullAddress AS [From Address]
, c.[To Postcode]
, c.[To Outlet]
, c.[To OutletName]
, o1.FullAddress AS [To Address]
, CAST(c.TotalUnits AS VARCHAR(MAX)) AS [Total Units]
, '$'+CAST(c.TotalValue AS VARCHAR(MAX)) AS [Total Value]
, '' AS Checked
, c.CustRecActive as Active
INTO #CustomerCodingChanges
FROM #CustomerCorrectionSummary AS c
LEFT JOIN ndf_061.IRGMaster.dbo.OutletMaster AS o
ON c.[From Postcode] = o.postcode
AND c.[From Outlet] = o.outlet
LEFT JOIN ndf_061.IRGMaster.dbo.OutletMaster AS o1
ON c.[To Postcode] = o1.postcode
AND c.[To Outlet] = o1.outlet
ORDER BY c.totalvalue DESC;
CustomerCorrectionSummaryT
和 OutletMasterT
的数据帧在 R 和 SQL Server 中的结果数量相同,所以我不知道为什么它不会显示相同的结果R 与 SQL 服务器中的结果数。在 SQL 服务器查询中 returns 22 行,而在 R 中我只得到一行都是正确的。 R 的 sqldf 只是没有显示所有内容。我认为这与我的 left join
功能有关,但我真的不知道。如果您需要更多信息,请告诉我!
如果你仔细查看,这两个查询是不一样的。值得注意的是,您在第一个查询 MAX
中调用了一个聚合,而您在第二个查询中没有调用该聚合。因此,第一个查询是一个聚合查询,它通过返回聚合的各种分组折叠单元级行(SUM
、COUNT
、AVG
、MIN
、MAX
、等)在指定列上。
此外,因为您没有包含 GROUP BY
子句,在标准 ANSI SQL 中,第一个查询应该会引发错误。不幸的是,对于 SQL 的新手来说,一些方言如 SQLite 和 MySQL 允许这样的语法。而R的sqldf
运行s SQLite默认。事实上,如果你 运行 在 SQL 服务器中的第一个查询,它会出错,因为你 运行 一个不正确的聚合查询 GROUP BY
子句中没有包含非聚合列尽管它们在 SELECT
子句中指定。
仔细观察,您似乎试图在 SQL Server
中翻译以下表达式
CAST(c.TotalUnits AS VARCHAR(MAX)) AS [Total Units]
这与第一个查询中尝试的行不同:
MAX(CAST(c.TotalUnits AS VARCHAR)) AS [Total Units]
SQLite实际上不维护maximum length in VARCHAR 类型。因此,只需保留原始行而无需聚合或大小限制:
CAST(c.TotalUnits AS VARCHAR) AS [Total Units]
出于某种原因,当涉及到 R 时,我只返回一行,而在 SQL 服务器上,我返回正确的行数。 SQL东风:
CustomerCodingChangesT <- sqldf("
SELECT c.CustID as ID
, c.ReverseSupplier as Supplier
, c.ReverseCustomerCode as Code
, c.Name
, c.Address
, c.[From PostCode]
, c.[From Outlet]
, c.[From OutletName]
, o.FullAddress AS [From Address]
, c.[To PostCode]
, c.[To Outlet]
, c.[To OutletName]
, o1.FullAddress AS [To Address]
, MAX(CAST(c.TotalUnits AS VARCHAR)) AS [Total Units]
, '$'+MAX(CAST(c.TotalValue AS VARCHAR)) AS [Total Value]
, '' AS Checked
, c.CustRecActive as Active
FROM CustomerCorrectionSummaryT AS c
LEFT JOIN OutletMasterT AS o
ON c.[From PostCode] = o.Postcode
AND c.[From Outlet] = o.Outlet
LEFT JOIN OutletMasterT AS o1
ON c.[To PostCode] = o1.Postcode
AND c.[To Outlet] = o1.Outlet
ORDER BY c.totalvalue DESC;")
SQL:
if object_id ('tempdb..#CustomerCodingChanges') is not null drop table #CustomerCodingChanges
SELECT c.CustID as ID
, c.ReverseSupplier as Supplier
, c.ReverseCustomerCode as Code
, c.Name
, c.Address
, c.[From Postcode]
, c.[From Outlet]
, c.[From OutletName]
, o.FullAddress AS [From Address]
, c.[To Postcode]
, c.[To Outlet]
, c.[To OutletName]
, o1.FullAddress AS [To Address]
, CAST(c.TotalUnits AS VARCHAR(MAX)) AS [Total Units]
, '$'+CAST(c.TotalValue AS VARCHAR(MAX)) AS [Total Value]
, '' AS Checked
, c.CustRecActive as Active
INTO #CustomerCodingChanges
FROM #CustomerCorrectionSummary AS c
LEFT JOIN ndf_061.IRGMaster.dbo.OutletMaster AS o
ON c.[From Postcode] = o.postcode
AND c.[From Outlet] = o.outlet
LEFT JOIN ndf_061.IRGMaster.dbo.OutletMaster AS o1
ON c.[To Postcode] = o1.postcode
AND c.[To Outlet] = o1.outlet
ORDER BY c.totalvalue DESC;
CustomerCorrectionSummaryT
和 OutletMasterT
的数据帧在 R 和 SQL Server 中的结果数量相同,所以我不知道为什么它不会显示相同的结果R 与 SQL 服务器中的结果数。在 SQL 服务器查询中 returns 22 行,而在 R 中我只得到一行都是正确的。 R 的 sqldf 只是没有显示所有内容。我认为这与我的 left join
功能有关,但我真的不知道。如果您需要更多信息,请告诉我!
如果你仔细查看,这两个查询是不一样的。值得注意的是,您在第一个查询 MAX
中调用了一个聚合,而您在第二个查询中没有调用该聚合。因此,第一个查询是一个聚合查询,它通过返回聚合的各种分组折叠单元级行(SUM
、COUNT
、AVG
、MIN
、MAX
、等)在指定列上。
此外,因为您没有包含 GROUP BY
子句,在标准 ANSI SQL 中,第一个查询应该会引发错误。不幸的是,对于 SQL 的新手来说,一些方言如 SQLite 和 MySQL 允许这样的语法。而R的sqldf
运行s SQLite默认。事实上,如果你 运行 在 SQL 服务器中的第一个查询,它会出错,因为你 运行 一个不正确的聚合查询 GROUP BY
子句中没有包含非聚合列尽管它们在 SELECT
子句中指定。
仔细观察,您似乎试图在 SQL Server
中翻译以下表达式CAST(c.TotalUnits AS VARCHAR(MAX)) AS [Total Units]
这与第一个查询中尝试的行不同:
MAX(CAST(c.TotalUnits AS VARCHAR)) AS [Total Units]
SQLite实际上不维护maximum length in VARCHAR 类型。因此,只需保留原始行而无需聚合或大小限制:
CAST(c.TotalUnits AS VARCHAR) AS [Total Units]