個別レコードに対する PIVOT クエリでのデータ損失の回避
問題:
PIVOT クエリは再構築に役立ちますデータを使用して情報をより体系的に表示します。ただし、個別のレコードを処理する場合、MAX 集計関数によってゼロ値が省略され、データが不完全になる可能性があります。
解決策:
すべての個別のレコードを保持するには、値がゼロの場合は、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
例:
次の表を考えてみましょう:
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 |
以前は、標準の PIVOT クエリは次のように生成されていました。 result:
Id | Code | James | James_ | Sam | Sam_ | Lisa | Lisa_ |
---|---|---|---|---|---|---|---|
1 | Prashant | Running | 43.43 | Cooking 1 | 73 | Walking | 90.34 |
1 | Prashant | Stealing | 0.0 | Cooking | 3.43 | NULL | NULL |
1 | Prashant | NULL | NULL | NULL | NULL | NULL | NULL |
ただし、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 |
このアプローチにより、すべての個別のアクティビティが表示されます。パーセント値が 0 であるため、データがより正確に表現されます。
以上がゼロ値を持つ個別のレコードに対して PIVOT クエリを使用するときにデータ損失を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。