2016-04-29 23 views
0

多くの列にNULL値がある場合、時間の経過に伴う累積合計をどのように計算するのですか?MySQL:NULLs行の累積合計の計算

ノー特定のエラーメッセージと外に次のことをしよう、と私のクエリ時間午前:

SELECT t1.time_purchased, 
    t1.savings AS daily_savings, 
    SUM(t2.savings) AS total_savings 
FROM items AS t1, 
    items AS t2 
WHERE t1.time_purchased >= t2.time_purchased 
GROUP BY t1.time_purchased; 

time_purchasedと貯蓄の行は、多くの場合、空です - このエラーの原因となっていますか?もしそうなら、私はこれらのエラーをスキップして、total_savingsに貯蓄を追加することができますか?

理想的には、time_purchasedとは関係なく、時間の経過と共に累積的な節約額を表示したいと考えています。ありがとう!

ソリューションEDIT:そこに助けをみんなに

感謝。最終的な解決策では、私のFROMステートメントで、節約にヌル値がないテーブルを選択する必要がありました。そうでない場合は、NULL値を追加していたためcumulative_sumが引き続きNULLになりました。 MySQLでは

SET @cumulative_sum := 0; 
SELECT 
    time_purchased 
    ,savings 
    ,(@cumulative_sum := @cumulative_sum + savings) AS cumulative_sum 
FROM (SELECT * FROM items WHERE savings IS NOT NULL) AS i 
ORDER BY time_purchased; 
+0

これはnull値とは関係ありません。問題は、クロス積が非常に大きいことです。 – Barmar

+1

この表にはすべての顧客に貯蓄がありますか?あなたは顧客別にグループ化していないので、これはすべての顧客とすべての日付に対して行を持ち、*すべての*他の顧客の累積合計を表示します。 – Barmar

+0

それはすべての顧客のための節約を持っていません - どのようにグループ化することをお勧めしますか? – avtomate

答えて

0

、累積和を行う最も簡単な方法は、変数を使用することです::以下のソリューションを参照してください

SELECT i.time_purchased, 
     i.savings 
     (@ds := @ds + i.savings) AS total_savings 
FROM items i CROSS JOIN 
    (SELECT @ds := 0) params 
ORDER BY i.time_purchased; 

私はあなたがNULL値で何をしたいのかわからないんだけど、少なくともこれはタイムアウトしてはいけません。

+0

お返事ありがとうございます。 4行目の "SUM(t2.savings)AS total_savings"には、タイプミスはありますか?私はあなたがt2.savings(t2がここに存在しないとき)を参照して、前の行で既にエイリアスされている "total_savings"としてエイリアスを参照していますか?また、select文はparamsとしてエイリアスされていますが、paramsは使用されません。さらにお手伝いいただきありがとうございます! – avtomate

+0

それを見つけました!助けてくれてありがとう:^) – avtomate

+0

@avtomate。 。 。その行はタイプミスでした –