sqldf 只返回一行,在 SQL 中使用相同的查询

问题描述

出于某种原因,当涉及到 R 时,我只返回一行,而在 sql Server 中,我返回了正确的行数。 sqlDF:

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.[From Postcode],c.[To Postcode],CAST(c.TotalUnits AS VARCHAR(MAX)) AS [Total Units],'$'+CAST(c.TotalValue AS VARCHAR(MAX)) AS [Total Value],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;

CustomerCorrectionSummaryTOutletMasterT 的数据帧在 R 和 sql Server 中的结果数量相同,所以我不知道为什么它不会在 R 中显示相同数量的结果而不是在 sql Server 中。在 sql Server 查询中返回 22 行,而在 R 中我只得到一行,两者都是正确的。 R 的 sqldf 只是没有显示所有内容。我认为这与我的 left join 函数有关,但我真的不知道。如果您需要更多信息,请告诉我!

解决方法

如果您仔细查看,这两个查询并不相同。值得注意的是,您在第一个查询 MAX 中调用了一个聚合,而在第二个查询中没有调用。因此,第一个查询是聚合查询,它通过返回聚合(SUMCOUNTAVGMINMAX、等)在指定的列上。

此外,因为您没有包含 GROUP BY 子句,所以在标准 ANSI SQL 中,第一个查询应该会引发错误。不幸的是,对于 SQL 的新手来说,一些方言(如 SQLite 和 MySQL)允许这种语法。 R 的 sqldf 默认运行 SQLite。事实上,如果您在 SQL Server 中运行第一个查询,它会出错,因为您运行了错误的聚合查询,因为 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]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...