sql >> Database teknologi >  >> RDS >> Sqlserver

SQL - Drej flere kolonner uden aggregater

En del af problemet er, at du har de-normaliserede data på tværs af flere kolonner, som du vil pivotere. Ideelt set bør du overveje at ordne din tabelstruktur, så det bliver lettere at vedligeholde og forespørge. Hvis du ikke er i stand til at rette tabelstrukturen, skal du først fjerne pivoteringen af ​​kolonnerne for derefter at anvende PIVOT for at få det endelige resultat.

UNPIVOT-processen vil tage de flere kolonner og konvertere dem til flere rækker. Afhængigt af din version af SQL Server er der et par måder, du kan gøre dette på. Du kan bruge UNPIVOT-funktionen, eller da du bruger SQL Server 2008, kan du bruge CROSS APPLY med VALUES-sætningen til at unpivot.

CROSS APPLY/VALUES-koden vil være:

select t.producttitle, c.col, c.value
from tmpData t
cross apply
(
  values (abvrMonthName, MonthAvg), (abvrMonthNameCount, MonthCount)
) c (col, value)
 

Se SQL Fiddle with Demo . Dette tager dine flere kolonner og placerer dataene i et format, der ligner dette:

| PRODUCTTITLE | COL | VALUE | ------------------------------- | Product 1 | Dec | 0 | | Product 1 | Dec# | 0 | | Product 1 | Nov | 0 | | Product 1 | Nov# | 0 | | Product 1 | Oct | 0 | | Product 1 | Oct# | 0 | | Product 1 | Sep | 0 | | Product 1 | Sep# | 0 |

Når dataene er i dette format, kan du anvende PIVOT på værdierne i col som indeholder månedsnavnene:

select producttitle, jan, [jan#], feb, [feb#], mar, [mar#], apr, [apr#],
  may, [may#], jun, [jun#], jul, [jul#], aug, [aug#],
  sep, [sep#], oct, [oct#], nov, [nov#], dec, [dec#]
from
(
  select t.producttitle, c.col, c.value
  from tmpData t
  cross apply
  (
    values (abvrMonthName, MonthAvg), (abvrMonthNameCount, MonthCount)
  ) c (col, value)
) d
pivot
(
  sum(value)
  for col in (jan, [jan#], feb, [feb#], mar, [mar#], apr, [apr#],
              may, [may#], jun, [jun#], jul, [jul#], aug, [aug#],
              sep, [sep#], oct, [oct#], nov, [nov#], dec, [dec#])
) piv;
 

Se SQL Fiddle with Demo . Dette giver et resultat:

| PRODUCTTITLE | JAN | JAN# | FEB | FEB# | MAR | MAR# | APR | APR# | MAY | MAY# | JUN | JUN# | JUL | JUL# | AUG | AUG# | SEP | SEP# | OCT | OCT# | NOV | NOV# | DEC | DEC# | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | Product 1 | 5 | 2 | 5 | 1 | 5 | 4 | 5 | 6 | 4.44 | 9 | 5 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | Product 2 | 0 | 0 | 0 | 0 | 0 | 0 | 4.33 | 3 | 4.67 | 3 | 5 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | | Product 3 | 4.6 | 5 | 4.75 | 8 | 4.75 | 8 | 4 | 6 | 5 | 6 | 5 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |


  1. Postgresql JSONB kommer. Hvad skal man bruge nu? Hstore? JSON? EAV?

  2. MySQL - Søg nøjagtigt ord fra streng

  3. PostgreSQL - hent den række, som har Max-værdien for en kolonne

  4. Tilføj en kolonne, der repræsenterer en sammenkædning af to andre Varchar-kolonner