Een deel van het probleem is dat u gegevens hebt gedenormaliseerd over meerdere kolommen die u wilt draaien. Idealiter zou u moeten overwegen om uw tabelstructuur aan te passen, zodat u deze gemakkelijker kunt onderhouden en opvragen. Als u de tabelstructuur niet kunt herstellen, moet u eerst de kolommen draaien om vervolgens PIVOT toe te passen om het uiteindelijke resultaat te krijgen.
Het UNPIVOT-proces neemt de meerdere kolommen en zet ze om in meerdere rijen. Afhankelijk van uw versie van SQL Server zijn er een paar manieren waarop u dit kunt doen. U kunt de functie UNPIVOT gebruiken of aangezien u SQL Server 2008 gebruikt, kunt u CROSS APPLY gebruiken met de VALUES-component om het draaien ongedaan te maken.
De CROSS APPLY/VALUES-code is:
select t.producttitle, c.col, c.value
from tmpData t
cross apply
(
values (abvrMonthName, MonthAvg), (abvrMonthNameCount, MonthCount)
) c (col, value)
Zie SQL Fiddle met demo . Dit neemt uw meerdere kolommen en plaatst de gegevens in een indeling die vergelijkbaar is met deze:
| 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 |
Zodra de gegevens in dit formaat zijn, kunt u de PIVOT toepassen op de waarden in col
die de maandnamen bevat:
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;
Zie SQL Fiddle met demo . Dit geeft een resultaat:
| 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 |