【问题标题】:Issue with SQL Group By and COALESCE on sqlitesqlite 上的 SQL Group By 和 COALESCE 问题
【发布时间】:2020-02-13 14:48:20
【问题描述】:

我在 sqlite 数据库中有一个如下表。我想创建一个按产品组显示使用情况的折线图。

Table: ProductUsageData

UserID  ProductName ProductGroup    Qty RecordID
1       A1          A               12  1   
2       A1          A               12  1   
1       A2          A               15  1   
3       A1          A               12  2   
2       B1          B               12  2   
5       B2          B               5   2
1       A1          A               12  3   
1       A2          A               15  3   
4       A1          A               12  3   
3       C1          C               12  3   
2       C2          C               15  3

因为我希望在查询下方使用的每个 ProductGroup 都有单独的行

SELECT 
      SUM(Qty) as UsedQty, 
      ProductGroup, 
      RecordID 
FROM ProductUsageData 
GROUP BY ProductGroup, RecordID  
ORDER BY RecordID ASC;

虽然我为 A 获得了 3 条记录(对于每个 RecordID),但对于 B 和 C,我只获得了 1 条记录,因为它们在每个 RecordID 中都没有使用。 问题是当我在图表中为每个 ProductGroup 放置一条线时,B & C 的点在第一个中按数量显示 我的输出是这样的

A   39  1
A   12  2
B   17  2
A   39  3
C   27  3   

所以图表看起来像这样

而不是

为了解决这个问题,如果在每次录制期间未使用 ProductGroup,我使用 COALESCE 更改了查询以获取 0 Qty。

SELECT 
       COALESCE(SUM(Qty), 0) as UsedQty, 
       ProductGroup, 
       RecordID 
FROM ProductUsageData 
GROUP BY ProductGroup, RecordID  
ORDER BY RecordID ASC;

我期待如下输出

A   39  1
B   0   1
C   0   1
A   12  2
B   17  2
C   0   2
A   39  3
B   0   3
C   27  3

但我得到的输出与第一个相同

请告诉我如何更正查询以获得所需的输出

【问题讨论】:

    标签: sql sqlite group-by


    【解决方案1】:

    一个典型的解决方案是首先cross join 两个查询,从表中选择不同的产品组和记录ID;这为您提供了productGrouprecordID 的所有可能组合。

    然后,您可以将带有left join 的原始表带入,并聚合:

    select
        g.productGroup,
        coalesce(sum(p.qty), 0) qty,
        r.recordID
    from (select distinct productGroup from productUsageData) g
    cross join (select distinct recordID from productUsageData) r
    left join productUsageData p
        on  p.productGroup = g.productGroup
        and p.recordID = r.recordID
    group by r.recordID, g.productGroup
    order by r.recordID, g.productGroup
    

    在现实世界中,您可能为产品组和记录 ID 提供单独的参考表,这将使查询更简单、更高效(因为它可以避免在子查询中使用 select distinct)。

    Demo on DB Fiddle

    产品组 |数量 |记录ID :----------- | :-- | :-------- 一个 | 39 | 1 乙| 0 | 1 C | 0 | 1 一个 | 12 | 2 乙| 17 | 2 C | 0 | 2 一个 | 39 | 3 乙| 0 | 3 C | 27 | 3

    【讨论】:

      猜你喜欢
      • 2018-05-13
      • 2010-12-18
      • 2015-03-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2012-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多