Днес получих данни от доставчици на продукти.
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 |
Как да транспонирам горната таблица по-долу?
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 |
Досега това, което съм направил, е да изтегля данните от SQL в Excel, да транспонирам данните един по един и да го върна на SQL. Въпреки това има около 4000 реда данни и аз се отказвам.
Как да се изгради заявка за трансформиране на тези данни? Използвам SQL сървър 2012.
Благодаря.
Отговори:
2 за отговор № 1Ако искате, ето един пример за това unpivot
синтаксис ще изглежда така.
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 за отговор № 2
Можете да се опитате да използвате unpivot
функция в T-SQL, или можете да използвате това, което според мен е по-прост синтаксис, който ви позволява почти WYSIWYG подред cross apply
с values
. NB За всеки нов набор от стойности се формира нов ред:
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)
Тази техника е добре обяснена тук: Подкрепа на UNPIVOT, част 1 (от Брад Шулц)