2013-11-03 44 views
-2

我有2个表。只有这3个记录持有日期类别(如下所示DIS.csv)。另一个包含我想返回的财务数据(VAU.csv)。MS查询SQL语句有2个表和3个记录

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

我想即使60 - 590总是返回3条记录。如果只找到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 

回答

1

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

我不确定数据库有问题的部分查询。这也适用于:
尝试更换用的Nz

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 
    

而只保留要去看看是什么问题...慢慢积聚到你想要查询使用。一般错误意味着我们试图做一些数据库不支持的事情。使用不存在的函数可能会是一个语法错误。

+0

您好,我真的很感谢您花时间看我的查询。我已经尝试过你的建议。我要么得到一个语法错误或一般的ODBC错误。我对你的例子进行了一些改变,发现MSQuery似乎不喜欢Coalesce功能,在我发现有一个替代ISNULL,但它仍然不喜欢(Syntax Error)。你给的第二个例子返回了“General ODBC Error”,如果我从第二个例子中取出Where子句,它没有错误地运行,但当然只返回一行。 –

+0

您是否认为我正在尝试使用MSQuery(将数据加载到Excel中)实现一些不可能的事情。虽然它看起来确实是一个相当基本的要求,所以我认为MSQuery会取决于它?再次感谢,我真的很感谢人们给予的任何帮助。 –

+0

告诉我确切的错误是什么,请...我不认为这是不可能的,MS办公室的东西有点奇怪,但总是有工作。不过,我没有实际测试任何实际环境的能力。我用'coalesce'给我一个0而不是空的空字段。看看查询是否运行没有。如果这是唯一的问题,我相信我们可以找到另一种方式来获得零。 –

0

非常感谢您的帮助,在逐步完成您给出的每一步之后,我已经在MSQuery中计算出您必须使用IIF语句,从而生成以下代码。我将TYPE改为CHASSIS和VALUE为SIV,但只是为了使数据库更易于阅读。再次,我真的很感谢像你这样帮助陌生人的人,因为这很容易点击下一页。 (VAU.SCH)是NULL,0,SUM(VAU.SIV))从DIS.csv作为总和DIS DIS LEFT JOIN(SELECT *)选择DIS.DISWORDING,COUNT(VAU.CHASSIS),IIF(SUM(VAU.SIV)是NULL,0,SUM(VAU.SIV) FROM VAU.csv AS VAU WHERE VAU.VEHICLETYPE ='TRADE')AS VAU ON DIS.DISID = VAU.DISID GROUP BY DIS.DISID,DIS.DISWORDING“

BTW刚刚阅读您的主页,真的很抱歉听到近期事件。保持领先的游戏,并为你身边所有...干杯