我有一个包含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
关于如何在简单的脚本上进行此操作的任何想法
答案 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)
击> <击> 撞击>