mysql脚本 - 数学解决方案

时间:2015-11-04 16:46:01

标签: mysql sql math

我有一个包含16列的表格: Id,Product_Id,Sunday,SundayCnt,Monday,MondayCnt,...,SaturdayCnt

如您所见,有工作日列和工作日计数列

如果工作日计数栏中的值大于零,我想平均每周工作日的值

示例

 Sunday=30    SundayCnt=0 
 Monday=27    MondayCnt=2 
 Tuesday=2    TuesdayCnt=0 
 Wednesday=75 WednesdayCnt=0 
 Thursday=2   ThursdayCnt=1 
 Friday=12    FridayCnt=0 
 Saturday=15  SaturdayCnt=22

对于此示例,averge必须仅采用(27 + 2 + 15)/3=14.66,因为那些天的Cnt列大于0

关于如何在简单的脚本上进行此操作的任何想法

2 个答案:

答案 0 :(得分:5)

这不会很漂亮。

  SELECT id, Product_Id, 
         IF( denominator = 0, null, numerator / denominator) as average
  FROM 
     (
      SELECT Id, Product_Id,
         (
             if( SundayCnt=0, 0, Sunday) +
             if( MondayCnt=0, 0, Monday) +
             if( TuesdayCnt=0, 0, Tuesday) +
             if( ThursdayCnt=0, 0, Wednesday) +
             if( FridayCnt=0, 0, Thursday) +
             if( SaturdayCnt=0, 0, Saturday) 
         ) as numerator ,
         (
             if( SundayCnt=0, 0, 1) +
             if( MondayCnt=0, 0, 1) +
             if( TuesdayCnt=0, 0, 1) +
             if( ThursdayCnt=0, 0, 1) +
             if( FridayCnt=0, 0, 1) +
             if( SaturdayCnt=0, 0, 1) 
         ) as denominator
      FROM YourTable
   ) as T

但你应该考虑将你的表改为

ID    ProductID   Sales   Counter   Day
1      1          30        0      Sunday
2      1          27        2      Monday
3      1          2         0      Tuesday
4      1          75        0      Wednesday
5      1          2         1      Thursday
6      1          12        0      Friday
7      1          15        22     Saturday

然后您的查询将非常简单

  SELECT product_id, IF(Count(*) = 0, null, SUM(Sales)/Count(*))
  From YourTable
  WHERE Counter <> 0
  GROUP BY product_id

答案 1 :(得分:0)

编辑:抱歉,只是看到列是实际的星期几,你想要每行的平均值,而不是行的平均值。

在那种情况下,是的,你需要明确迭代每一列的公式,将工作日值添加到分子中,并在cnt&gt;时将+1加到分母中。 0.我认为这里给出的另一个anser应该足够了,但有一点需要注意:你应该用NULLIF(...,0)包装分母,以避免除以0错误(在这种情况下,当所有cnts为0时,整体平均值将评估为0 / NULL,这将只是NULL)

在SQL中,聚合函数(如AVG,SUM等)忽略NULL的输入。因此,只要CNT为0,您就需要向AVG提供NULL:

AVG(CASE WHEN weekday_cnt = 0 THEN NULL ELSE weekday_val END)

<击>