2

これが可能だとは思いませんが、そうでないことを証明したいと思います。

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

私の要件を簡単な例で説明すると、おそらく役立つでしょう。このデータセットを想像してください:

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

可能であれば、データセットを次のように返したいと思います。

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

MySQLでプログラム的にこれを行う方法はありますか?

4

4 に答える 4

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、手続き型言語の変数と同じように使用できます。

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

次に、SELECT句でチェックされます。の現在の値が@rと等しくない場合yearyearが出力され、そうでない場合NULLは が出力されます。

3 番目に、 の現在の値で更新されますyear

于 2009-05-27T14:30:59.937 に答える
4

なぜこれをしたいのですか?Year 列が空または null である既存のレコードはどうなるでしょうか?

出力の美化は、レポート ロジック内に属します。疑似コードでは、sth になります。お気に入り:

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

   // print the other columns
 }
于 2009-05-27T14:38:12.900 に答える
1

それはあなたの要求と完全には一致しませんが、私はむしろ私のテーブルをピボットしたいと思います。列ごとに4分の1があるため、2年間の数値を視覚的に比較できます。

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 
于 2009-08-19T16:05:48.480 に答える
1

あなたが求めた答えではありませんが...

そもそもMySQLでやっていることは、あやふやなことのように思えます。生のデータ行だけを見ると、2008 年と 2009 年の第 2 四半期はデータ行としてあまり意味がないように見えます。この問題は表示上のものであり、データの取得の問題ではありません。たとえば、特定のパラメーターが渡されると、「2008」のようなことを繰り返さないように認識されます。

これにより、コードの再利用性も向上します。たとえば、年単位ではなく四半期単位など、データを別の方法で表示したい場合にクエリを書き直すのではなく、表示クラスの引数の 1 つを変更するだけで、同じクエリが別の順序句を使用すると、次のように出力できます。

Quarter   Year   Total
Q1        2008   20
          2009   15
Q2        2008   25
          2009   20
...
于 2009-05-27T14:38:43.023 に答える