最佳产品组合数据所需的SQL查询

时间:2014-04-06 16:50:07

标签: sql sql-server

我在一家处理草药成分的小公司工作。我们根据“产品组合”(成分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 ?? ??
  等等

1 个答案:

答案 0 :(得分:0)

我无法提供更具体的答案,但我认为你需要做的是;

  1. 使用CUBE获取所有组合并汇总SUMAVGSummarizing Data Using CUBE

  2. CUBE查询将从嵌套查询中获取其数据,该查询的数据范围是值而不是实际值。您可以参考SQL's CASE expression获取有关转换数据的更多信息,以便它存储值的范围而不是值。

  3. 因此,换句话说,首先转换数据,以便存储值出现的范围。然后,根据转换后的数据,使用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