0

考虑以下数据:

Items | Price | Categories
--------------------------
Item1 |    10 | Cat1, Cat2
Item2 |    20 | Cat1, Cat3
Item3 |    15 | Cat1, Cat2
--------------------------
Total |    45

如果我根据类别对数据进行分组,则会出现以下统计信息

Categories | Price
------------------
Cat1       |    45
Cat2       |    25
Cat3       |    20
------------------
Total      |    90

现在,如果我必须总结价格,实际总和将为45但根据显示的类别的总和将不同,即90。因此,两种表示都表示不同的统计数据,但它们以自己的方式是正确的。

寻找这个问题的答案:我将如何表示这样的统计数据。例如,Top 上的总数为 45,但各个类别的总和为 90。我的意思是,这不会让最终用户感到困惑吗?

除了为每个项目选择一个类别之外,关于如何解决这个问题的任何建议?

4

2 回答 2

1

以下是 BigQuery 标准 SQL

#standardSQL
SELECT category, SUM(price) AS price FROM (
  SELECT category, price FROM `project.dataset.table`, 
  UNNEST(SPLIT(categories, ', ')) category UNION ALL
  SELECT 'Total', price FROM `project.dataset.table`
)
GROUP BY category

如果适用于您的问题中的示例数据,如下例所示

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'Item1' AS item, 10 AS price, 'Cat1, Cat2'  AS categories UNION ALL
  SELECT 'Item2', 20, 'Cat1, Cat3' UNION ALL
  SELECT 'Item3', 15, 'Cat1, Cat2' 
)
SELECT category, SUM(price) AS price FROM (
  SELECT category, price FROM `project.dataset.table`, 
  UNNEST(SPLIT(categories, ', ')) category UNION ALL
  SELECT 'Total', price FROM `project.dataset.table`
)
GROUP BY category   

结果是

Row category    price    
1   Cat1        45   
2   Cat2        25   
3   Cat3        20   
4   Total       45     

具有正确的总值

于 2020-06-15T17:56:45.033 回答
0

您可以拆分数据,然后重新聚合:

with t as (
      select 'Item1' as item, 10 as price, 'Cat1, Cat2'  as categories union all
      select 'Item2', 20, 'Cat1, Cat3' union all
      select 'Item3', 15, 'Cat1, Cat2' union all
      select 'Total', 45, NULL
     )
select coalesce(category, 'Total'), sum(price)
from t cross join
     unnest(split(t.categories, ', ')) category
group by rollup(category)
order by category nulls last;

如果您不需要总数,则删除rolllup.

于 2020-06-15T10:45:00.763 回答