【问题标题】:MS Query SQL Statement with 2 tables and 3 records带有 2 个表和 3 条记录的 MS Query SQL 语句
【发布时间】:2013-11-03 15:54:36
【问题描述】:

我有 2 张桌子。一个仅包含这 3 条记录的日期类别(如下所示DIS.csv)。另一个包含我要返回的财务数据 (VAU.csv)。

VAU.csv
ID    WORDING  
1     30 - 59 Days  
2     60 - 89 Days  
3     90+  Days   

我希望始终返回 3 条记录,即使 60 - 590。如果仅找到 1 条记录,则下面的 SQL 语句仅返回 1 行。如有必要,我希望返回所有 3 行,其中的计数为 0,值为 0。

SELECT  DIS.DISWORDING, 
        Count(VAU.ITEM), 
        Sum(VAU.VALUE) 

FROM    DIS.csv DIS 
        LEFT JOIN VAU.csv VAU ON DIS.ID = VAU.ID 

WHERE   VAU.TYPE = 'TRADE' 

GROUP   BY DIS.DISWORDING

【问题讨论】:

    标签: sql excel csv


    【解决方案1】:

    http://sqlfiddle.com/#!2/d005f/16/0

    我修改了 sql fiddle 的表名。我想我把它们改回来了......

    select  dis.diswording, 
            count(vau.item) as item_count, 
            coalesce(sum(vau.value),0) as value_sum
    
    from    dis.csv as dis  
    
            left join vau.csv as vau 
               on dis.id = vau.id and vau.type = 'trade'  
    
    group   by dis.diswording;
    

    你几乎是对的。 type='trade' 的条件需要出现在 join 语句中,而不是出现在 where 中。 left outer join 表示您想要来自dis.csv 的所有行,并且只需要来自vau.csv 的匹配行。我花了一分钟才弄清楚,但是在其中有 type='trade' 会导致一些数据丢失。

    你也可以这样想:

    select  dis.diswording, 
            count(vau.item) as item_count, 
            coalesce(sum(vau.value),0) as value_sum
    
    from    dis.csv as dis  
    
            left join (select *
                       from   vau.csv 
                       where  vau.type = 'trade') as vau 
               on dis.id = vau.id 
    
    group   by dis.diswording;
    

    编辑
    代替coalesce(sum(vau.value),0) as value_sum 你可以试试:
    Nz(sum(vau.value),0) as value_sum

    • 请告诉我您的确切和完整错误是什么(您可以更新问题)。有几种方法可以重新编写查询,因此我确信可以将其切换为可接受的内容。 Jet/Excel/Office 有点奇怪和敏感。在将它们提供给您之前,我没有任何方法可以在您的实际环境中测试这些查询。

    我不确定数据库查询的哪一部分存在问题。这也有效:
    尝试用 Nz 替换 coalesce

    select  dis.diswording, 
            sum(case when vau.type='trade' 
                       then 1 else 0 end) as item_count, 
            coalesce(sum(case when vau.type='trade' 
                              then vau.value 
                              else 0 end),0) as value_sum
    
    from    dis.csv as dis  
    
            left join vau.csv as vau 
               on dis.id = vau.id  
    
    group   by dis.diswording;
    

    您能否尝试对其进行故障排除,看看它给出了一般错误的查询部分?只需通过删除部分使查询尽可能简单......然后添加内容。看看你是否可以隔离问题。

    1. 这会运行吗? (试试它最基本的形式)

        select  dis.id, dis.diswording,
                vau.item, vau.value, vau.type
      
         from   dis.csv as dis  
      
                left join vau.csv as vau 
                   on dis.id = vau.id 
      
    2. 这会运行吗? (尝试在加入中过滤交易)

        select  dis.id, dis.diswording,
                vau.item, vau.value, vau.type
      
         from   dis.csv as dis  
      
                left join vau.csv as vau 
                   on dis.id = vau.id and vau.type='trade'
      
    3. 这会运行吗? (尝试嵌套选择)

        select  dis.id, dis.diswording,
                vau.item, vau.value, vau.type
      
         from   dis.csv as dis  
      
                left join (select * from vau.csv where type='trade') as vau 
                   on dis.id = vau.id  
      
    4. 这会运行吗? (假设 #1 有效,将 sum/count 添加到有效的查询中)

        select  dis.id, dis.diswording,
                count(vau.item) as item_count, 
                sum(vau.value)  as vaue_sum 
      
         from   dis.csv as dis  
      
                left join vau.csv as vau 
                   on dis.id = vau.id
      
         group by dis.id, dis.diswording 
      

    然后继续下去,看看问题出在哪里......慢慢建立您想要使用的查询。一般错误意味着我们正在尝试做一些数据库不支持的事情。使用不存在的函数可能会出现语法错误。

    【讨论】:

    • 您好,非常感谢您抽出宝贵时间查看我的查询。我已经尝试过你的建议。我收到语法错误或一般 ODBC 错误。我对您的示例进行了一些排列,发现 MSQuery 似乎不喜欢 Coalesce 功能,四处搜寻我发现有一个替代的 ISNULL 仍然不喜欢(语法错误)。您给出的第二个示例返回“常规 ODBC 错误”,如果我从第二个示例中取出 Where 子句,它运行时没有错误,但当然只返回一行。
    • 您是否认为我正在尝试实现 MSQuery 无法实现的目标(将数据加载到 Excel 中)。虽然它看起来确实是一个相当基本的请求,但我认为 MSQuery 会满足它吗?再次感谢,我非常感谢人们提供的任何帮助。
    • 请告诉我确切的错误是什么...我不认为这是不可能的,ms office 的东西有点奇怪,但总有一种解决方法。不过,我没有能力在您的实际环境中实际测试任何东西。我使用 coalesce 给我一个 0 而不是空字段的 null。看看查询是否在没有它的情况下运行。如果这是唯一的问题,我相信我们可以找到另一种方法来获得零。
    • 尝试...并像这样使用Nz 函数:Nz(sum(vau.value),0) as value_sum。谷歌似乎认为它是一个等价物。抱歉,在建议之前我无法自己测试。
    【解决方案2】:

    非常感谢您的帮助,在逐步完成您提供的每个步骤时,我发现在 MSQuery 中您必须使用 IIF 语句,从而产生以下代码。我将 TYPE 更改为 CHASSIS 并将 VALUE 更改为 SIV,但这只是为了使数据库更易于阅读。再次感谢像您这样的人在轻松点击下一页时帮助陌生人。

    "SELECT DIS.DISWORDING, COUNT(VAU.CHASSIS), IIF(SUM(VAU.SIV) IS NULL, 0, SUM(VAU.SIV)) AS SUM FROM DIS.csv AS DIS LEFT JOIN (SELECT * FROM VAU.csv AS VAU WHERE VAU.VEHICLETYPE ='TRADE') AS VAU ON DIS.DISID = VAU.DISID GROUP BY DIS.DISID, DIS.DISWORDING"

    顺便说一句,刚刚阅读了您的主页,听到最近发生的事件真的很遗憾。保持领先地位,为您身边的所有人提供支持...干杯

    【讨论】:

      猜你喜欢
      • 2012-12-14
      • 1970-01-01
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多