【发布时间】:2015-05-29 14:53:19
【问题描述】:
我正在构建的这个 MS Access 查询非常慢。我只测试了一个月的数据(一个表驱动这个查询,有 28,577 条记录,36 列)。
这是我想要完成的任务:
我想按特定交易类型返回按型号销售的独特车辆的数量(此数据库未标准化,并且是从加载到表中的 Excel 表构建的)。
存在第一个子查询是因为据我了解,在 Access 中不能将 DISTINCT 语句与聚合函数一起使用。所以我需要构建一个子查询来处理 Count(DISTINCT VIN)。
第二个子查询是我认为的罪魁祸首。每个 VIN 可能有许多条目。例如,一辆车辆可能已使用我正在计算的交易类别之一出售,然后被取消,并转售到我不想计算的交易类别之一。这将为此 VIN 生成三条记录:
- 销售到我想统计的交易类别
- 取消第一次销售
- 转售到我不想统计的交易类别
第二个子查询检查 VIN 是否有“取消销售”记录,然后不包括第一个销售。
希望我解释得很好,有人可以为我提供一个潜在的解决方案来加快这个查询。
谢谢
查询
PARAMETERS [Enter Sales Month Start Date] DATETIME, [Enter Sales Month End Date]
DATETIME;
SELECT DSTNCT_COUNT.trans AS Trans,
DSTNCT_COUNT.mdl AS Model,
Count(DSTNCT_COUNT.cnt) AS VIN_COUNT
FROM (SELECT DISTINCT new_bbss.vin AS cNt,
new_bbss.[model category] AS MDL,
new_bbss.[trans category] AS Trans
FROM new_bbss
WHERE ( ( ( new_bbss.[trans category] ) NOT LIKE 'Individual'
AND ( new_bbss.[trans category] ) NOT LIKE 'Corporate'
AND ( new_bbss.[trans category] ) NOT LIKE 'Cancel'
AND ( new_bbss.[trans category] ) NOT LIKE 'Partners'
AND ( new_bbss.[trans category] ) NOT LIKE 'Special'
AND ( new_bbss.[trans category] ) NOT LIKE 'Employee'
AND ( new_bbss.[trans category] ) NOT LIKE 'Mobile'
AND ( new_bbss.[trans category] ) NOT LIKE 'JLR FLEET' )
AND ( ( new_bbss.[retailer code] ) LIKE 'R*' ) )
AND new_bbss.[trans date] BETWEEN [enter sales month start date]
AND
[enter sales month end date]
AND new_bbss.vin NOT IN(SELECT new_bbss.vin
FROM new_bbss
WHERE new_bbss.[trans category] LIKE
'CancelVIP*'
OR new_bbss.[trans category] LIKE
'CancelDealer Local*'
OR new_bbss.[trans category] LIKE
'CancelLoaner*'
OR new_bbss.[trans category] LIKE
'CancelAlive*'))
AS DSTNCT_COUNT
GROUP BY trans, mdl;
【问题讨论】:
标签: sql ms-access subquery ms-access-2010