在MySQL

时间:2017-07-21 21:16:35

标签: mysql sql-update case

我想我几乎想到了这一点但是经过50多次Google搜索之后,我问这个问题:如何在db中添加一个本质上是sumif函数的列?我已经看到许多相关问题只是简单的Select语句,只是在迷你表中查看表格,但我希望实际上添加一个列来显示这些总数。我正在接受这个,然后将数据拉入R进行进一步分析。

在Excel中,它的工作方式如下,[]表示表的列。它通过Serial#分为2个区域。序列的前6位数字表示“父”,后半部分表示“孩子”。一位家长可以有多个孩子,如下面的BSA101所示。我要做的是将制作孩子所需的所有费用(父母+儿童费用)计算在内。所以父母的总费用,分配给下面的两个孩子。

“打包”是最后一步,所以这就是我希望总计结束的地方,所以没有重复。

示例

=IF(LEN([serial])>6,IF([process]="Packing",SUMIF([serial],[@serial],[process_cost])+SUMIF([serial],LEFT([@serial],6),[process_cost]),""),"")

serial  process process_cost    total_child_cost
BSA101A33   Packing  10         160 
BSA101A34   Packing  10         195 
BSA101      Cast     50         ""
BSA101      Mold     30         ""
BSA101      Mold     30         ""
BSA101A33   Finish   15         ""
BSA101A34   Finish   25         ""
BSA101A33   Polish   25         ""
BSA101A34   Polish   50         ""

^上面所需的表格结果

MySQL尝试:这篇文章帮助了我Adding Case Statements

SQL小提琴:http://sqlfiddle.com/#!9/b0e58

我已在data中添加了一个名为total_cost的列。现在我得到了一个“无效使用组函数”错误,在研究之后,它会讨论一个HAVING条款但不知道放在哪里。

UPDATE data
    SET total__child_cost = 
        (CASE WHEN length(serial) > 6
                    AND process = 'Packing'
                        THEN
                            IF(serial = serial, sum(process_cost),0) END)
                            +
                            (CASE WHEN left(serial,6) = serial
                                THEN sum(process_cost)
                            END)

1 个答案:

答案 0 :(得分:0)

这最终成为了解决方案。

DELIMITER //
CREATE FUNCTION `getParent1`(inSerialn Varchar(20)) RETURNS int(11)
BEGIN
    Declare parent varchar(20); 
    Declare result int; 
    set parent = left(inSerialn, 6);
    set result = (Select sum(process_cost) From mfng.data where serialn = parent);
    return result;
END //

 DELIMITER //
CREATE FUNCTION `getChild1`(inSerialn Varchar(20)) RETURNS int(11)
BEGIN
    Declare result int; 
    set result = (Select sum(process_cost) FROM mfng.data where serialn = inSerialn);
    return result;
END//

UPDATE mfng.data set total_child_cost = 
(case when length(serialn) > 6 AND pdn_process = 'Packing'
THEN 
getChild1(serialn) + getParent1(serialn)
ELSE 
0 END);
//