2016-05-19 1 views
0

私は彼に正しい質問をしたいと思いますが、集計された出力のセットを合計し、その順序を同時にフォーマットしたいと思います。集計された出力のセットを合計してその並びを同時にフォーマットする方法

サンプルテーブル:

Entity Type Value 
A  1  200 
B  1  500 
C  0  350 
B  0  150 
D  0  200 
C  1  100 
A  1  50 
A  1  350 
D  1  100 
E  1  150 

予想される出力:

Entity diff_positive diff_negative 
A   600 
B   350 
E   150 
C       250 
D       100 
------------------------------ 
total  500    350 

助けを借りて、私は結果から減算し、「Type'1' のすべてEntity'Aを合計することができました、タイプ '0'のEntity'A 'の合計この差が正または負である場所を示す表を同時に入力します。 現在、これは私が持っているものです。

select entity, 
greatest(sum(case when type = 1 then value else - value end), 0) as diff_positive, 
greatest(sum(case when type = 0 then value else - value end), 0) as diff_negative  
from t 
group by entity 
ORDER BY diff-negative, entity ASC; 

電流出力:

Entity diff_positive diff_negative 
A   600 
B   350 
E   150 
D       100 
C       250 

私が期待される出力に示されているように 'entity'D前に出現する' entity'Cが必要です。

また、合計を取得するには、私は以下のようにDiff-PositiveとDiff-Negativeをsum()しようとしました。

select entity, 
sum(greatest(sum(case when type = 1 then value else - value end), 0) as diff_positive), 
sum(greatest(sum(case when type = 0 then value else - value end), 0) as diff_positive) 
from t 
group by entity; 

エラーが発生します。

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'diff_positive), sum(greatest(sum(case when type = 0 then value else - value end), 0) as diff_negative) 

私は私はこの時点から、それを把握することができるはずな感覚を持っている、しかし、私は、合計を取得するには

+0

、あなたは 'を持っている;' 'by'グループの後、by''順序はselect文 – Rhumborl

+0

@TimBiegeleisenの一部ではありませんので: 'type'がの値に依存するように見えます列(1 = + ve、0 = -ve)。なぜ、 'value'カラムが単に+ ve/-veとして保存されるのではなく、' type'カラムが削除されたのです。 – eggyal

+0

@eggyal:それは単に私のデータプレゼンテーションの要件です。 –

答えて

0

をMySQLへかなり新しいよ、with rollupを使用しています。注文を得るには、order byを使用してください。 。 。ゼロの値が最後になります:

select entity, 
     greatest(sum(case when type = 1 then value else - value end), 0) as diff_positive, 
     greatest(sum(case when type = 0 then value else - value end), 0) as diff_negative  
from t 
group by entity 
order by diff_positive desc, diff_negative asc; 

代替order byは次のとおりです。

order by sum(case when type = 1 then value else - value end) 

表現を使用することにより、あなたがorder byで1つのキーだけを使用することができます。

EDIT:

select entity, sum(diff_positive) as diff_positive, 
     sum(diff_negative) as diff_negative) 
from (select entity, 
      greatest(sum(case when type = 1 then value else - value end), 0) as diff_positive, 
      greatest(sum(case when type = 0 then value else - value end), 0) as diff_negative  
     from t 
     group by entity 
    ) e 
group by entity with rollup 
order by diff_positive desc, diff_negative asc; 

group byが本当にrollup以外何もしません。

ロールアップが集約2つのレベルが使用を動作させるために。

コメントで
+0

使用するロールアップは、次のエラー#1221を与える - 作品(diff_positive DESC、diff_negative ASCによって順)なしのロールアップを使用して –

+0

BY CUBE/ROLLUPとORDERの誤った使用方法が、間違った合計値を生成します。これは、最初にGREATERステートメントの比較によって除去されたCASEステートメントによって生成された負の値を含む、diff_positive列のすべてをロールアップするためです。どのようにして正の値だけを丸めることができますか? –

0

I said

+は/ -veましおよび削除type列が私を超えているとしてvalue列がちょうど保存されていない理由けれども。

そして、いくつかの議論の後、you replied

[OK]をクリックします。しかし、私はそれについての経験はないので、そのアイデアはまだまだ曖昧です。私はこれを実装することをどのように提案するのですか?

  1. まず、valueの値を更新:への変換を実行すると、アプリケーションが必要とする結果を得る

    ALTER TABLE t DROP type; 
    
  2. UPDATE t SET value = -value WHERE type = 0; 
    
  3. 第二に、type列を削除アプリケーションコード内のプレゼンテーションモデル。たとえば、PDOのいずれかを使用すると、以下のことを行うことができます:それはまた、あなたの古いモデルと、この両方に1を提案し、ことは注目に値するかもしれ

    $stmt = $pdo->query(' 
        SELECT entity, SUM(value) AS diff 
        FROM  t 
        GROUP BY entity 
        ORDER BY diff DESC 
    '); 
    
    $total_positive = $total_negative = 0; 
    
    while ($row = $stmt->fetch()) { 
        if ($row['diff'] > 0) { 
        // handle positive diff here as before 
    
        $total_positive += $row['diff']; 
        } else { 
        // handle negative diff here as before 
    
        $total_negative += $row['diff']; 
        } 
    } 
    

、各entityは-ve かのいずれかになります。全体を通してしたがって、あなたの古いモデル(と、厳密に言えば、この新しいものでvalueの記号)でtype2NFに違反し、この表でそれを繰り返す-SO entityに依存しています。あなたの最初のクエリで

+0

これは興味深いものです。私はあなたの意味や、 '値'を+ ve/-veとして保存し、今まで 'タイプ'を削除する実装を理解していませんでした。私はすでにこの提案されたモデルの上辺を見ることができます。私はこの角度を確かに将来探るつもりです。私はこれを完全に実装するために私の他のコードをたくさん書き直す必要があるので、私は今これを行う必要はありません。 –

+0

これは私の最初の質問ではありません。しかし、私は実際に私が必要なので、私はこの答えを受け入れる。そしてそれは私のためにうまくいった。 Thnx。 –

関連する問題