ホームページ >データベース >mysql チュートリアル >関連を保持し、ゼロ値を処理しながら、個別のレコードに対して PIVOT クエリを実行するにはどうすればよいですか?

関連を保持し、ゼロ値を処理しながら、個別のレコードに対して PIVOT クエリを実行するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-24 06:49:14434ブラウズ

How Can I Perform a PIVOT Query on Distinct Records While Preserving Associations and Handling Zero Values?

関連付けが保持された個別レコードに対する PIVOT クエリ

個人のアクティビティとパーセンテージを含むデータを含むテーブルがあるシナリオを考えてみましょう。 MAX 関数を使用した標準の PIVOT クエリでは、パーセント値がゼロのアクティビティを見落とす可能性があります。この問題に対処するために、アクティビティとパーセンテージの関係を保持するソリューションを導入します。

これを実現するには、共通テーブル式 (CTE) に ROW_NUMBER() 関数を組み込み、各テーブル内のアクティビティを順番に並べます。名前のグループ。この手法を使用すると、PIVOT クエリは複数の行にわたるアクティビティとパーセンテージの間の関連付けを保持できます。

修正されたクエリの例を次に示します。

;with cte as 
(
    select *, ROW_NUMBER() over (partition by name order by percentage desc) ROWNUM
    from A
),
cte2 as
(
    SELECT Id,Code,ROWNUM,James,James_,Sam,Sam_,Lisa,Lisa_
    FROM cte
    PIVOT(MAX(activity)
          FOR name IN (James,Sam,Lisa)) AS PVTTable PIVOT
          (
          MAX(percentage)
          FOR name1 IN (James_,Sam_,Lisa_)) AS PVTTable1
)
select Id, Code, MAX(James) James, MAX(James_) James_, MAX(Sam) Sam, MAX(Sam_) Sam_, MAX(Lisa) Lisa, MAX(Lisa_) Lisa_
from cte2
group by Id, Code, ROWNUM

CTE (cte) は ROWNUM を追加します。列を最初のテーブルに追加し、各名前のアクティビティをパーセンテージの降順に並べます。この順序により、後続の PIVOT クエリでデータを正しくグループ化して集計できるようになります。

クエリの出力は、期待される結果と似ており、個別のアクティビティがそれぞれの名前とパーセンテージに関連付けられています。

Id  Code        James       James_  Sam         Sam_    Lisa    Lisa_
1   Prashant    Running     43.43   Cooking 1   73      Walking 90.34
1   Prashant    Stealing    0.00    Cooking     3.43    NULL    NULL
1   Prashant    Lacking     0.00    NULL        NULL    NULL    NULL

この手法を使用すると、パーセンテージ値がゼロのレコードであっても、アクティビティとパーセンテージの関連付けを維持しながら、完全かつ正確な PIVOT 結果を取得できます。

以上が関連を保持し、ゼロ値を処理しながら、個別のレコードに対して PIVOT クエリを実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。