我在一家处理草药成分的小公司工作。我们根据“产品组合”(成分A,B和C的含量)定期计算成分的有效性。我有一个包含数千行的表,如下所示:
产品成分A成分B成分C有效性
1 A 28 94 550 4,1
2 B 50 105 400 4,3
3 C 30 104 312 3,5
.. Etc etc etc etc Etc
我想要的结果如下表所示。我在过去几年使用excel但是很难处理数百万的数据,因此我现在希望在sql中有类似的东西。我使用Pivot和子查询进行了多次尝试,但我没有设法得到我需要的结果。
特别是,在前三列中,我包括各种范围/标准。在“平均有效性”栏中,计算符合这些标准的“总产品”的平均有效性。由于范围是数百个,例如对于成分A,我有超过100种不同的范围,对于成分B和C,我想要一种方法来自动拥有A,B,C成分(范围)的所有多种组合。
INGR。一个Ingr。 B Ingr。 C总产品平均有效性
1-10 50-60 90-110 ??? ???
1-10 50-60 110-130 ??? ??
1-10 50-60 130-150 ???? ??
1-10 60-70 150-170 ??? ??
10-20 60-70 90-110 ??? ??
10-20 60-70 110-130 ??? ??
10-20 60-70 130-150 ?? ??
等等
答案 0 :(得分:0)
我无法提供更具体的答案,但我认为你需要做的是;
使用CUBE
获取所有组合并汇总SUM
和AVG
值
Summarizing Data Using CUBE
CUBE
查询将从嵌套查询中获取其数据,该查询的数据范围是值而不是实际值。您可以参考SQL's CASE expression获取有关转换数据的更多信息,以便它存储值的范围而不是值。
因此,换句话说,首先转换数据,以便存储值出现的范围。然后,根据转换后的数据,使用CUBE
对其进行汇总,以获得所有组合。所以#1是外部查询,#2是内部查询。
这是一个非常粗略关于查询可能是什么样子的想法,只是为了给你一个想法:
Select Ingr_A, Ingr_B, Ingr_C, COUNT(*), AVG(Effectiveness)
(SELECT
Product,
Effectiveness,
"Ingr_A" =
CASE
WHEN Ingredient_A >= 10 and Ingredient_A < 20 THEN '[10, 20)'
WHEN Ingredient_A >= 20 and Ingredient_A < 30 THEN '[20, 30)'
...
END,
"Ingr_B" =
CASE
(like above)
END,
"Ingr_C"
(etc.)
FROM ProductsTable)
GROUP BY Ingr_A, Ingr_B, Ingr_C WITH CUBE