按多个类别中的项目的总价分组

wi3ka0sx  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(350)

考虑以下数据:

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。所以这两种表示都表示不同的统计信息,但它们以自己的方式是正确的。
寻找这个问题的答案:我将如何表示这样一个统计数字。例如,总在顶部说45,但整个类别的总和说90。我的意思是,这对终端用户来说不是很混乱吗?
除了为每个项目选择一个类别之外,还有什么其他的建议吗?

hc2pp10m

hc2pp10m1#

下面是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

总价值正确

j2cgzkjk

j2cgzkjk2#

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

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 .

相关问题