【问题标题】:sqldf only returning one row, same query used in SQLsqldf 仅返回一行,与 SQL 中使用的查询相同
【发布时间】:2021-08-18 08:17:45
【问题描述】:

由于某种原因,当涉及到 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.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;

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

【问题讨论】:

    标签: sql r sqldf


    【解决方案1】:

    如果您仔细查看,这两个查询并不相同。值得注意的是,您在第一个查询 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]
    

    【讨论】:

    • 哦!这次真是万分感谢!当它被否决为-1时,我失去了希望没有人会回答这个问题。我只是 stackoverflow 的新手,我真的尽力寻找导致我的错误的类似问题,但我想我没有很好地查看 MAX 功能。再次感谢您!
    • 很高兴听到并乐于提供帮助!编码愉快!
    猜你喜欢
    • 1970-01-01
    • 2015-05-28
    • 2016-08-20
    • 2020-11-13
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多