2017-07-21 5 views
0

これはほとんどわかっていますが、50以上のGoogle検索の後に、私は質問します:本質的にsumif関数であるdbに列を追加するにはどうすればよいですか?私は多くの関連する質問をミニテーブルのテーブルを見るための単純なSelect文として見てきましたが、実際にはの合計を表示する列を追加したいと考えていました。私はこれを取って、その後の分析のためにRにデータを引っ張っています。2つのSUM CASE文をMySQLの列更新として追加します

Excelでは、[]は表の列を表すように機能します。それはSerial#で2つの領域に分割されています。シリアルの最初の6桁は「親」を示し、後半は「子」を示します。下のBSA101で見られるように、1つの親は複数の子を持つことができます。私がしようとしているのは、子供を作るために費やされたすべての費用(親子費用)を合計することです。したがって、親の総費用は、以下の両方の子供に割り当てられます。

"パッキング"は最後のステップですので、ここでは合計が終わって重複がないようにしたいと思っています。

=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の試み:http://sqlfiddle.com/#!9/b0e58

:この記事は私 Adding Case Statements

SQLフィドルを助けました

datatotal_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) 
+0

参照[なぜ私は非常に単純なSQLクエリであることを私には思える何のためにMCVEを提供する必要があります](http://meta.stackoverflow.com/questions/333952/why-should-i-provide-非常にシンプルなSQLクエリ) – Strawberry

+0

申し訳ありませんが、私はこれらを尋ねるとSQL Fiddleを忘れてしまいます - ブックマークしてください!まもなくこの例を追加します。 –

+0

フィディはそれの最も重要な部分です。 – Strawberry

答えて

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); 
// 
関連する問題