sql >> Databasteknik >  >> RDS >> Sqlserver

SQL - Pivotera flera kolumner utan aggregat

En del av problemet är att du har avnormaliserade data över flera kolumner som du vill pivotera. Helst bör du överväga att fixa din tabellstruktur så att det blir lättare att underhålla och fråga. Om du inte kan fixa tabellstrukturen bör du först avpivotera kolumnerna för att sedan använda PIVOT för att få det slutliga resultatet.

UNPIVOT-processen tar de flera kolumnerna och konverterar dem till flera rader. Beroende på din version av SQL Server finns det några sätt att göra detta på. Du kan använda UNPIVOT-funktionen eller eftersom du använder SQL Server 2008 kan du använda CROSS APPLY med VALUES-satsen för att avpivot.

CROSS APPLY/VALUES-koden kommer att vara:

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

Se SQL-fiol med demo . Detta tar dina flera kolumner och placerar data i ett format som liknar detta:

| 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 data är i detta format kan du tillämpa PIVOT på värdena i col som innehåller månadsnamnen:

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-fiol med demo . Detta ger ett 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. När jag anger en dateadd- eller datediff-kod får jag det här felet hela tiden ORA-00904 DATEADD Ogiltig IDENTIFIER.

  2. Mysql, Kontrollera fältvärdesändring?

  3. Hur man beställer efter datum i PostgreSQL eller Oracle

  4. android.database.sqlite.SQLiteException:nära s:syntaxfel (kod 1):,