ホームページ > データベース > mysql チュートリアル > 情報の損失を避けるために、異なるレコードを持つデータを正確にピボットするにはどうすればよいですか?

情報の損失を避けるために、異なるレコードを持つデータを正確にピボットするにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-30 13:01:12
オリジナル
459 人が閲覧しました

How Can I Accurately Pivot Data with Distinct Records to Avoid Losing Information?

個別のレコードを効果的にピボットする

ピボット クエリは、データを表形式に変換し、簡単なデータ分析を可能にする上で重要な役割を果たします。ただし、個別のレコードを扱う場合、ピボット クエリのデフォルトの動作に問題が生じる可能性があります。

問題: 個別の値の無視

次の表を考慮してください:

------------------------------------------------------
| Id    Code  percentage  name  name1   activity     |
-----------------------------------------------------
| 1   Prashant  43.43    James  James_  Running      |
| 1   Prashant  70.43    Sam    Sam_    Cooking      |
| 1   Prashant  90.34    Lisa   Lisa_   Walking      |
| 1   Prashant  0.00     James  James_  Stealing     |
| 1   Prashant  0.00     James  James_  Lacking      |
| 1   Prashant  73       Sam     Sam_   Cooking 1    |
------------------------------------------------------
ログイン後にコピー

従来のピボット クエリ、たとえばas:

SELECT Id,Code,
    MAX(CASE WHEN name = 'James' THEN activity END) AS James,
    MAX(CASE WHEN name1 = 'James_' THEN percentage END) AS James_,
    MAX(CASE WHEN name = 'Sam' THEN activity END) AS Sam,
    MAX(CASE WHEN name1 = 'Sam_' THEN percentage END) AS Sam_,
    MAX(CASE WHEN name = 'Lisa' THEN activity END) AS Lisa,
    MAX(CASE WHEN name1 = 'Lisa_' THEN percentage END) AS Lisa_
FROM A
GROUP BY Id, Code
ログイン後にコピー

は次のテーブルになります:

-------------------------------------------------------------------
Id  Code        James    James_  Sam        Sam_    Lisa      Lisa_
-------------------------------------------------------------------
1   Prashant    Running  43.43  Cooking     3.43    Walking   90.34
1   Prashant    Stealing 0.0    NULL        NULL    NULL      NULL
-------------------------------------------------------------------
ログイン後にコピー

ここでの問題は、name が繰り返され、パーセンテージが 0 の場合、ピボット クエリは name1 の個別の値を無視することです。この場合、James の「不足している」アクティビティは失われます。

解決策: を使用します。精度を高める ROW_NUMBER()

これに対処するには、ROW_NUMBER():

;with cte as 
(
    select *, ROW_NUMBER() over (partition by name order by percentage desc) ROWNUM
    from A
)
...
ログイン後にコピー

ROW_NUMBER() を使用して、名前に基づいてデータを分割し、それぞれを割り当てます。そのパーティション内で一意の番号を行に並べます。これにより、名前が繰り返される場合でも、アクティビティとパーセンテージの関連付けを保持できます。

結果のテーブルは次のようになります:

----------------------------------------------------------
| 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
----------------------------------------------------------
ログイン後にコピー

James の「不足」を含むすべてのアクティビティ、ピボット テーブルに表示されるようになりました。この手法により、個別の値が確実に保持され、分析用の正確なデータが提供されます。

以上が情報の損失を避けるために、異なるレコードを持つデータを正確にピボットするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート