Heim > Datenbank > MySQL-Tutorial > Wie kann man eine Tabelle dynamisch PIVOTIEREN und eindeutige Datensätze ohne Prozentsätze beibehalten?

Wie kann man eine Tabelle dynamisch PIVOTIEREN und eindeutige Datensätze ohne Prozentsätze beibehalten?

Susan Sarandon
Freigeben: 2024-12-28 16:52:10
Original
990 Leute haben es durchsucht

How to Dynamically PIVOT a Table and Retain Distinct Records with Zero Percentages?

Dynamische PIVOT-Abfrage für eindeutige Datensätze

Problem:

Betrachten Sie die folgende Tabelle:

| 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 |
Nach dem Login kopieren

Die Verwendung einer Standard-PIVOT-Abfrage kann schwierig sein Behalten Sie eindeutige Datensätze mit 0,00-Prozentsätzen bei. Die MAX-Funktion ignoriert diese Zeilen oft, was zu unvollständigen Ergebnissen führt.

Erwartetes Ergebnis:

| 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 |
Nach dem Login kopieren

Lösung:

Um dieses Problem zu beheben, können wir eine ROW_NUMBER()-Funktion in die PIVOT-Abfrage einführen. Diese Funktion weist den Datensätzen innerhalb jeder Namensgruppe Zeilennummern zu und stellt so sicher, dass auch Datensätze mit 0,00-Prozentsätzen beibehalten werden.

;with cte as (
    select *, ROW_NUMBER() over (partition by name order by percentage desc) ROWNUM
    from table_name
),
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
Nach dem Login kopieren

Erklärung:

  • Die Der erste allgemeine Tabellenausdruck (cte) fügt der Tabelle eine ROWNUM-Spalte hinzu und ordnet die Datensätze innerhalb jeder Namensgruppe nach Prozentsatz in absteigender Reihenfolge Reihenfolge.
  • Der zweite gemeinsame Tabellenausdruck (cte2) verwendet dann die PIVOT-Funktion, um die Daten neu zu strukturieren.
  • Abschließend gruppieren wir die Ergebnisse nach Id, Code und ROWNUM, um die Pivot-Ergebnisse zu kombinieren und behalten Sie die 0,00-Prozent-Datensätze bei.

Wichtig Hinweis:

Um die Abfrage dynamisch zu gestalten, können wir die hartcodierten Werte „name“ und „name1“ durch dynamische Variablen ersetzen, die zur Laufzeit gefüllt werden können. Dadurch kann die Abfrage Tabellen mit unterschiedlicher Spaltenanzahl verarbeiten.

Das obige ist der detaillierte Inhalt vonWie kann man eine Tabelle dynamisch PIVOTIEREN und eindeutige Datensätze ohne Prozentsätze beibehalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage