ホームページ  >  に質問  >  本文

MySQL - 行を列に変換する

投稿を検索しようとしましたが、SQL Server/Access のソリューションしか見つかりませんでした。 MySQL (5.X) での解決策が必要です。

ホスト ID、項目名、項目値の 3 つの列を持つテーブル (履歴と呼ばれる) があります。

選択 (select * from History) を実行すると、

が返されます。 リーリー

データベースにクエリを実行して同様のコンテンツを返す方法

リーリー


P粉538462187P粉538462187372日前606

全員に返信(1)返信します

  • P粉920199761

    P粉9201997612023-10-14 10:02:42

    この問題を解決する手順について、さらに詳しく説明を追加します。長すぎる場合は申し訳ありません。


    あなたが示した基礎から始めて、それを使用して、この記事の残りの部分で使用するいくつかの用語を定義します。これは ベーステーブル :

    になります。 リーリー

    これが私たちの目標です、美しいピボット テーブル:

    リーリー

    history.hostid 列の値は、ピボット テーブルの y 値になります。 history.itemname 列の値は x-values になります (理由は明白です)。


    ピボット テーブルの作成の問題を解決する必要がある場合、私は 3 つのステップのプロセスを使用して問題を解決します (オプションの 4 番目のステップもあり):

    1. 対象の列、つまり y 値 および x 値
    2. を選択します。
    3. 追加の列でベース テーブルを拡張します - x 値ごとに 1 つの列
    4. 拡張テーブルをグループ化して集計します -
    5. y 値ごとに 1 つのセット (オプション)集計テーブルを美しくする
    6. これらの手順を問題に適用して、結果を確認してみましょう:

    ステップ 1: 対象の列を選択します

    。望ましい結果では、hostidy 値 を提供し、itemnamex 値 を提供します。

    ステップ 2: 追加の列でベース テーブル

    を拡張します。通常、x 値ごとに 1 つの列が必要です。 x 値列が itemname: であることを思い出してください。 リーリー 行数は変更していないことに注意してください。列を追加しただけです。

    NULL

    のパターンにも注意してください。itemname = "A" の行には、新しい列 A に null 以外の値があり、他の新しい列には null 以外の値が含まれています。ヌル値。

    ステップ 3: 拡張テーブルをグループ化して集計します

    。 y 値を提供するため、hostid による grouping が必要です: リーリー

    (y 値ごとに 1 つの行があることに注意してください。)

    さて、もうすぐ到着です。醜い NULL を取り除く必要があるだけです。

    ステップ 4: 美化

    。結果セットの見栄えを良くするために、null 値をゼロに置き換えます。 リーリー これで完了です – MySQL を使用して美しいピボット テーブルを構築しました。

    このプロセスを適用する際の注意点:

    追加の列で使用する値。この例では
      itemvalue
    • を使用しました 追加の列で使用する「中立」値。ここでは
    • NULL
    • を使用しましたが、状況に応じて 0 または "" を使用することもできます。 グループ化するときに使用する集計関数。 sum
    • を使用しましたが、
    • countmax もよく使用されます (max は単一の行を作成するときによく使用されます)。行オブジェクト") 複数の列を使用して y 値を表します。この解決策は、y 値に単一の列を使用することに限定されません。追加の列を group by
    • 句に挿入するだけです (そして、それらを
    • select することを忘れないでください) 既知の制限事項:

    このソリューションでは、ピボット テーブルに n 列を使用できません。ベース テーブルを拡張するときに、各ピボット列を手動で追加する必要があります。したがって、5 または 10 x の値の場合、この解決策は問題ありません。 100元、あまり良くありません。ストアド プロシージャを使用してクエリを生成する解決策はいくつかありますが、それらは見苦しく、正しく実行するのが困難です。ピボットテーブルに多くの列が必要な場合に、この問題を解決する良い方法は現時点ではわかりません。

      返事
      0
  • キャンセル返事