MS 查询 SQL 语句,包含 2 个表和 3 条记录



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

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

我希望即使0 60 - 59也始终返回 3 条记录。 下面的 SQL 语句仅在仅找到 1 条记录时返回 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

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

我修改了 sql 小提琴的表名。 我想我把它们改回来是正确的....

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有点奇怪和敏感。在将这些查询交给您之前,我没有任何方法可以在您的实际环境中测试这些查询。

我不确定数据库在查询的哪个部分有问题。 这也适用于:
尝试用新西兰替换合并

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 有效,将总和/计数添加到有效的查询中)

      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 
    

然后继续下去,看看问题是什么......慢慢构建到要使用的查询。 一般错误意味着我们正在尝试执行数据库不支持的操作。 使用不存在的函数可能是语法错误。

非常感谢

您的帮助,在完成您给出的每个步骤时,我已经发现在 MSQuery 中您必须使用 IIF 语句,从而生成下面的代码。我将类型更改为机箱,将值更改为 SIV,但只是为了使数据库更易于阅读。再次,我真的很感谢像你这样的人帮助陌生人,当点击下一页如此容易。

"选择迪斯。措辞,计数(VAU.底盘),IIF(总和(VAU.SIV) 为空,0,总和(VAU.SIV)) 作为 DIS 中的总和.csv作为 DIS 左连接(从 VAU 中选择 *.csv作为 VAU 其中 VAU。车辆类型 ='贸易') 作为 VAU 在 DIS.DISID = VAU。迪斯迪德组由迪斯。迪西德,迪斯。措辞"

顺便说一句,刚刚阅读您的主页,听到最近的事件真的很抱歉。保持领先地位,并在您身边陪伴...干杯

最新更新