/ / Transformuj dane w SQL Server - sql-server, transform

Transformuj dane w SQL Server - sql-server, transform

Dzisiaj otrzymałem dane od dostawców produktów.

AdviserName|IF-Nov16|IF-Dec16|NB-Nov16|NB-Dec16|CN-Nov16|CN-Dec16|TotalPolcy|Provider|
-----------|--------|--------|--------|--------|--------|--------|----------|--------|
John Smith |$100    |$100    |$50     |$25.50  |-$20    |-$30    |12        |ANZ     |
Adrian Ken |$200    |$250    |$1000   |$2000   |-$500   |-$700   |30        |AXA     |

Jak mogę przetransponować powyższą tabelę poniżej?

AdviserName|Month|Year|Status|Amount     |TotalPolicy|Provider|
-----------|-----|----|------|-----------|-----------|--------|
John Smith |Nov  |16  |IN    |$100       |12         |ANZ     |
John Smith |Dec  |16  |IN    |$100       |12         |ANZ     |
John Smith |Nov  |16  |NB    |$50        |12         |ANZ     |
John Smith |Dec  |16  |NB    |$25.50     |12         |ANZ     |
John Smith |Nov  |16  |CN    |-$20       |12         |ANZ     |
John Smith |Dec  |16  |CN    |-$30       |12         |ANZ     |
Adrian Ken |Nov  |16  |IN    |$200       |30         |AXA     |
Adrian Ken |Dec  |16  |IN    |$250       |30         |AXA     |
Adrian Ken |Nov  |16  |NB    |$1000      |30         |AXA     |
Adrian Ken |Dec  |16  |NB    |$2000      |30         |AXA     |
Adrian Ken |Nov  |16  |CN    |-$500      |30         |AXA     |
Adrian Ken |Dec  |16  |CN    |-$700      |30         |AXA     |

Do tej pory to, co zrobiłem, to pobrać dane z SQL, aby Excel, przenieść dane jeden po drugim i umieścić go z powrotem do SQL. Jednak istnieje około 4000 wierszy danych i ja się poddaję.

Jak zbudować zapytanie, aby przekształcić te dane? Korzystam z serwera SQL 2012.

Dzięki.

Odpowiedzi:

2 dla odpowiedzi № 1

Jeśli chcesz, oto przykład tego, co unpivot wyglądałaby jak składnia.

create table dbo.dataTable
(
AdviserName varchar(100)
, [IF-Nov16] smallmoney
, [IF-Dec16] smallmoney
, [NB-Nov16] smallmoney
, [NB-Dec16] smallmoney
, [CN-Nov16] smallmoney
, [CN-Dec16] smallmoney
, TotalPolcy int
, [Provider] char(3)
)

insert into dbo.dataTable
values ("John Smith", 100, 100, 50, 25.50, -20, -30, 12, "ANZ")
, ("Adrian Ken", 200, 250, 1000, 2000, -500, -700, 30, "AXA")


select a.AdviserName
, substring(a.col_nm, 4, 3) as [Month]
, substring(a.col_nm, 7, 2) as [Year]
, substring(a.col_nm, 1, 2) as [Status]
, a.Amount
, a.TotalPolcy
, a.[Provider]
from dbo.dataTable as dt
unpivot (Amount for Col_Nm in ([IF-Nov16], [IF-Dec16], [NB-Nov16], [NB-Dec16], [CN-Nov16], [CN-Dec16])) as a

2 dla odpowiedzi nr 2

Możesz spróbować użyć unpivot funkcja w języku T-SQL lub możesz użyć prostszej składni, która pozwala uzyskać układ WYSIWYG w niemalże cross apply z values. NB Dla każdego nowego zestawu wartości tworzony jest nowy wiersz:

SELECT t.AdviserName, ca.Month, ca.Year, ca.Status, ca.Amount, t.TotalPolicy, t.Provider
FROM YourTable t
CROSS APPLY (
("Nov", 16, "IN", t.[IF-Nov16])
, ("Dec", 16, "IN", t.[IF-Dec16])
, ("Nov", 16, "NB", t.[NB-Nov16])
, ("Dec", 16, "NB", t.[NB-Dec16])
, ("Nov", 16, "CN", t.[CN-Nov16])
, ("Dec", 16, "CN", t.[CN-Dec16])
) ca (Month, Year, Status, Amount)

Ta technika jest dobrze wyjaśniona tutaj: Spotlight na UNPIVOT, część 1 (autor: Brad Schultz)