您首先需要使用交叉连接获得一组不同的用户+游戏所有可能组合:
select distinct u.user, g.game
from game g
cross join user u
;
这将给出以下结果:
| USER | game |
|-------|----------------|
| Chris | dungen |
| Chris | naruto |
| Chris | winning eleven |
| Gale | dungen |
| Gale | naruto |
| Gale | winning eleven |
| Donna | dungen |
| Donna | naruto |
| Donna | winning eleven |
然后您可以通过这种方式将此结果集(使用外连接)加入user 表:
SELECT *
FROM (
select distinct u.user, g.game
from game g
cross join user u
) x
LEFT JOIN user u ON x.user = u.user and x.game = u.game
;
以上查询为您提供以下结果集:
| user | game | USER | game | score |
|-------|----------------|--------|----------------|--------|
| Chris | naruto | Chris | naruto | 10 |
| Gale | dungen | Gale | dungen | 9 |
| Donna | winning eleven | Donna | winning eleven | 8 |
| Chris | dungen | (null) | (null) | (null) |
| Chris | winning eleven | (null) | (null) | (null) |
| Gale | naruto | (null) | (null) | (null) |
| Gale | winning eleven | (null) | (null) | (null) |
| Donna | dungen | (null) | (null) | (null) |
| Donna | naruto | (null) | (null) | (null) |
接下来,您可以使用上述结果集通过简单的 SUM 和 GROUB BY 生成报告。
但首先您需要将所有空值替换为 0,因为空值之和给出空值。
这样:
SELECT x.user, x.game,
sum( case when score is not null then score else 0 end ) as score
FROM (
select distinct u.user, g.game
from game g
cross join user u
) x
LEFT JOIN user u ON x.user = u.user and x.game = u.game
GROUP BY x.user, x.game
order by x.user, x.game
;
此查询产生以下结果:
| user | game | score |
|-------|----------------|-------|
| Chris | dungen | 0 |
| Chris | naruto | 10 |
| Chris | winning eleven | 0 |
| Donna | dungen | 0 |
| Donna | naruto | 0 |
| Donna | winning eleven | 8 |
| Gale | dungen | 9 |
| Gale | naruto | 0 |
| Gale | winning eleven | 0 |
您可以在此处找到完整的可运行示例:http://sqlfiddle.com/#!9/657cdf/12
我在这些示例中使用 SQL 的 MySql 方言,因为它在 SqlFiddle 上可用
但我相信将其转换为 MS-Access 应该不是问题。
=== 编辑 - 如何将此查询转换为 MS-Access 方言 ===
我已经在 MS-Access 2010 上测试了这个查询
MS-Access 不支持的只有两件事:
MS Access 不支持 CROSS JOIN 关键字。
可以这样转换:How to use cross join in access?
在表格之间使用“旧”语法和逗号:
SELECT DISTINCT u.user, g.game
FROM game g, user u
MS-Access 不支持大小写表达式
:
CASE WHEN condition THEN value1 ELSE value2 END
但您可以使用 IIF 函数:
IIF( condition, value1, value2 )
更多信息在这里:Does MS Access support "CASE WHEN" clause if connect with ODBC?
整个查询转换为 MS-Access 方言:
SELECT x.user, x.game,
sum( IIF( u.score IS NOT NULL, u.score, 0)) as score
FROM (
SELECT DISTINCT u.user, g.game
FROM game g, user u
) x
LEFT JOIN user u ON x.user = u.user and x.game = u.game
GROUP BY x.user, x.game
ORDER BY x.user, x.game
查询结果(在 MS-Access 中):