-2

我有 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
4

2 回答 2

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;

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

你也可以这样想:

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 
    

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

于 2013-11-03T16:16:52.630 回答
0

非常感谢您的帮助,在完成您提供的每个步骤时,我已经确定在 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"

顺便说一句,刚刚阅读了您的主页,很遗憾听到最近发生的事件。在比赛中保持领先,并为您周围的所有人提供支持......干杯

于 2013-11-04T18:28:12.263 回答