我有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;
您可以尝试对其进行故障排除以查看它给出一般错误的查询的哪一部分吗? 只需通过删除零件使查询尽可能简单...然后添加东西。 查看是否可以隔离问题。
这能运行吗?(尝试最基本的形式)
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
这能运行吗?(尝试在连接中过滤交易)
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'
这能运行吗?(尝试嵌套选择)
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
这能运行吗?(假设 #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。迪斯迪德组由迪斯。迪西德,迪斯。措辞"
顺便说一句,刚刚阅读您的主页,听到最近的事件真的很抱歉。保持领先地位,并在您身边陪伴...干杯