使用具有多个计数列的分组集

时间:2014-12-02 15:28:30

标签: sql count grouping

我正在尝试为我的数据库中的每个计算机制造商 - 型号组合计算三个具体事项。这三件事是组合的数量,借用每个组合的学生人数,以及计算机借用的总次数。最后两个是不同的,因为学生可以多次借用相同的组合。最后一部分是获取每列的总计(这似乎在我的查询中不正确)。我开发了以下查询。

SELECT item_manuf||'-'|| item_model "item", 
    count(DISTINCT comp_id) "Num Comps", 
    count(DISTINCT st_id) "Num Users", 
    count(loan_id) "Num Loans"
FROM computer 
JOIN item USING (item_id)
JOIN loan USING (comp_id)
GROUP BY GROUPING SETS((Item_Manuf, 
    Item_Model),());

结果表:

item                                                 Num Comps  Num Users  Num Loans
--------------------------------------------------- ---------- ---------- ----------
Acer-Aspire                                                  1          1          1
Apple-Macbook Air                                            1          1          1
Apple-Macbook Pro                                            1          1          1
Dell-Alienware                                               1          1          1
Dell-Inspiron                                                2          3          3
HP-Elitebook                                                 2          3          3
HP-Envy                                                      2          1          2
HP-Pavilion                                                  3          2          3
HP-Stream Notebook                                           1          1          1
Lenovo-ThinkPad                                              1          3          3
-                                                           15         10         19

11 rows selected.

每个特定组合行中的计数是正确的。我已经用原始数据验证了这一点。但是,收到的用户总数不正确。我做了一些调查,发现分组集给了我数据库中学生的总数。不是唯一的学生 - 制造 - 模型组合的总数。我相信这也与其他两个总计一起发生,但这是正确的结果。在此先感谢您的所有帮助!

1 个答案:

答案 0 :(得分:0)

GROUPING SETS不会为您提供总计。等效查询是:

SELECT item_manuf||'-'|| item_model "item", 
    count(DISTINCT comp_id) "Num Comps", 
    count(DISTINCT st_id) "Num Users", 
    count(loan_id) "Num Loans"
FROM computer 
JOIN item USING (item_id)
JOIN loan USING (comp_id)
GROUP BY Item_Manuf, Item_Model
UNION ALL
SELECT null, 
    count(DISTINCT comp_id) "Num Comps", 
    count(DISTINCT st_id) "Num Users", 
    count(loan_id) "Num Loans"
FROM computer 
JOIN item USING (item_id)
JOIN loan USING (comp_id);