2017-04-05 29 views
0

我有这样一个表:如何在Access SQL中总结一个组的所有值(即使那些不在组中)?

MUN | TYPE | LENGTH 
-----|-------|-------- 
001 | A  | 5 
001 | A  | 2 
002 | A  | 3 
002 | C  | 8 
003 | B  | 6 

而且我想告诉每个MUN所有类型和它们lenghts这样的:

MUN | TYPE | LENGTH 
-----|-------|-------- 
001 | A  | 7 
001 | B  | 0 
001 | C  | 0 
002 | A  | 3 
002 | B  | 0 
002 | C  | 8 
003 | A  | 0 
003 | B  | 6 
003 | C  | 0 

需要注意的是,例如,MUN 001 doesn'没有类型B和C,但它们应该以0长度出现。

我已经试过这样的事情:

SELECT DISTINCT 
    A.MUN, 
    A.TYPE 
    SUM(A.LENGTH) 
FROM 
    MY_TABLE AS A 
    LEFT JOIN (SELECT DISTINCT TYPE FROM MY_TABLE) AS B ON A.TYPE = B,TYPE 
GROUP BY 
    A.MUN, A.TYPE 

但应该更像一个完整的加入?我试图让左连接和右连接的联合,没有运气。

从一开始,我觉得这个查询是有点废话,我没有任何其他方式来实现这一点。

+1

如果您需要总结的价值观,你为什么用'COUNT(则为a.length)'? –

+1

为什么Mun 001的第二个实例有0型的A型? – Parfait

+0

对不起那些错误。我不得不急于发布这个问题。 – cag

回答

0

最后,我设法做了一个丑陋的查询来完成这项工作。这是每个类型的查询的联合,在我的情况下只有少数几个,没关系,但是对于数百或数千个这不是一个有效的答案,所以这不被接受。

这里是 “杰作”:

SELECT DISTINCT 
    MUN, 
    "A" AS TYPE, 
    (SELECT Nz(SUM(LENGTH), 0) FROM MY_TABLE WHERE MUN = T.MUN AND TYPE= 'A') AS LENGTH 
FROM MY_TABLE AS T 
UNION 
SELECT DISTINCT 
    MUN, 
    "B" AS TYPE, 
    (SELECT Nz(SUM(LENGTH), 0) FROM MY_TABLE WHERE MUN = T.MUN AND TYPE= 'B') AS LENGTH 
FROM MY_TABLE AS T 
UNION 
SELECT DISTINCT 
    MUN, 
    "C" AS TYPE, 
    (SELECT Nz(SUM(LENGTH), 0) FROM MY_TABLE WHERE MUN = T.MUN AND TYPE= 'C') AS LENGTH 
FROM MY_TABLE AS T