2009-05-27 11 views
2

私はこれが可能だとは思わないが、そうでなければ証明されたい。MySQL - グループ化された値の最初のインスタンスにのみフィールド値を表示しますか?

さまざまなデータベースクエリの結果を出力するための簡単なレポート表示クラスを作成しました。表示を改善する目的で、グループ化されたデータを持つレポートがある場合、各固有値の最初の行にのみフィールド値を表示したいと思います。クエリレベルでこれを実行したいと思います。これらの特別な値を決定するためには、クラス内に追加ロジックが必要です。

簡単な例で私の要件を説明するのに役立ちます。このデータセットを想像:MySQLではprogammaticallyこれを行う方法はあり

Year Quarter Total 
2008 Q1   20 
     Q2   25 
     Q3   35 
     Q4   40 
2009 Q1   15 
     Q2   20 
     Q3   30 
     Q4   35 

Year Quarter Total 
2008 Q1   20 
2008 Q2   25 
2008 Q3   35 
2008 Q4   40 
2009 Q1   15 
2009 Q2   20 
2009 Q3   30 
2009 Q4   35 

可能な場合に、私は、データセットとして返さ希望ですか?ここ

答えて

7
SELECT CASE WHEN @r = year THEN NULL ELSE year END AS year, 
     quarter, 
     total, 
     @r := year 
FROM (
     SELECT @r := 0 
     ) vars, 
     mytable 
ORDER BY 
     year 

@rセッション変数です。 MySQLには、手続き型言語の変数のように、これらを使用できます。

まず、サブクエリの内部でゼロに初期化されます。

第2に、SELECT句でチェックされています。 @rの現在の値がyearと等しくない場合は、yearが出力され、それ以外の場合はNULLが出力されます。

第3に、現在値がyearで更新されています。

+1

+1これは、より良いレポートクライアントで行うものですけれども:あなたは、列ごとに四分の一を持っているように、視覚的に2年からの数値を比較することができますP – Andomar

+0

+1は実用的なソリューションですが、メンテナンスにはかなりの労力が必要です。クラスの機能を処理するよりも多くのことが必要です。私は、列名に値を追加して、クラスにフラグを立てて特定の方法でデータを表示することをやります。たとえば、「Year__FirstGroup」です。 – BrynJ

+0

@BrynJ:@Andomarによれば、これはもちろんクライアント側でもうまくいきますが、「維持する努力」が何を意味するのかは本当にわかりません。このクエリーは一度書かれても壊れておらず、ここには何も残っていません:) – Quassnoi

4

なぜこれをやりたいですか?年の列が空またはnullの既存のレコードはどうですか?

出力の美しさは、レポートロジック内に属します。擬似コードでは、それはsthです。以下のような:あやふやなものが最初の場所でのMySQLでやっているよう

var lastYear = 0 
foreach (record in records) 
{ 
    if (record.Year == lastYear) 
    { 
    print " " 
    } 
    else 
    { 
    print record.Year 
    lastYear = record.Year 
    } 

    // print the other columns 
} 
+0

はい、私はあなたが言っていることを理解しています - 私は実装/維持する最も簡単な方法を探しています。 MySqlにそのような解決策があったとしたら、おそらくGROUP_CONCATなどの関数の形になっていて、それは簡単で保守的な解決策になります。 – BrynJ

+0

私はこのようにグループ化したい(クエリレベルの)列名に特定の文字列を追加することを考えます。たとえば、SELECT YEAR(date)AS 'Year__FirstGroup'、MONTH(date)AS月、SUM(何でも)AS total from mytable GROUP BY年、月 – BrynJ

1

ないあなたは尋ねた答えは、しかし...

が鳴ります。生データの行を見るだけで、2008年と2009年のQ2はデータ行としてはあまり意味がないようです。問題はプレゼンテーションであり、データを取得する問題ではありません。あなたの視聴クラスに書き込むもののように聞こえます。たとえば、あるパラメータを渡すと、 "2008"のようなことを繰り返さないことがわかります。

これは、同様に、コードの大きな再利用することができます:むしろあなたは、異なる方法でデータを提示四半期で言うのではなく一年にしたいとき、あなただけのように、視聴クラスの引数の1つを変更することができ、クエリを書き直すよりも、異なる順序句を出力することができると同じクエリこと:

Quarter Year Total 
Q1  2008 20 
      2009 15 
Q2  2008 25 
      2009 20 
... 
+0

データの観点からは意味をなさないことを感謝します。私は、あなたがGROUP_CONCATなどを持っているのと同じ方法で、組み込み関数を使ってmysqlでこれを行う簡単な方法があることを期待していました。 – BrynJ

1

それはまさにあなたの要求と一致していませんが、私はむしろ私のテーブルを旋回します。

SELECT Year, 
     SUM(IF(Quarter="Q1", Rev, 0)) AS Q1, 
     SUM(IF(Quarter="Q2", Rev, 0)) AS Q2, 
     SUM(IF(Quarter="Q3", Rev, 0)) AS Q3, 
     SUM(IF(Quarter="Q4", Rev, 0)) AS Q4 
FROM t1 GROUP BY 1 
ORDER BY 1 

あなたはその後、持っている:

YEAR Q1 Q2 Q3 Q4 
2008 
2009 
関連する問題