【问题标题】:Using Grouping Set with multiple count columns使用具有多个计数列的分组集
【发布时间】:2014-12-02 15:28:29
【问题描述】:

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

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.

每个特定组合行中的计数都是正确的。我已经用原始数据验证了这一点。但是,收到的用户总数不正确。我做了一些调查并注意到分组集给了我数据库中的学生总数。不是唯一的学生制造模型组合的总数。我相信其他两个总计也会发生这种情况,但这是正确的结果。提前感谢您的所有帮助!

【问题讨论】:

  • 查询的哪一部分正在获得 15,10,19 的底部计数......在我看来,您似乎只能获得每个制造商和型号组合的计数,而不是每个列的总数
  • 没关系,不知道分组集做了什么.....试着从你的计数中取出不同的东西
  • 取出不同的结果让我的计数与最后一列相同

标签: sql count grouping


【解决方案1】:

在您的情况下,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);

【讨论】:

  • 这实际上给了我与上述查询相同的结果。我可以合并然后对每一列求和吗?
  • @kirie 它给了你同样的效果,因为我试图解释分组集是如何工作的——它只是将不同的分组结合在一起
  • @kirie 你确定总和会在这里提供任何有用的东西吗?
  • 哦,我现在明白了。谢谢你的解释。好吧,我考虑过如何创建数据透视表,我们使用这些数据的总和。
猜你喜欢
  • 1970-01-01
  • 2014-06-05
  • 2019-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多