Как перенести эти данные - PullRequest
       33

Как перенести эти данные

0 голосов
/ 21 февраля 2020

У меня есть эта проблема, мне нужно transpose данные, как вы делали бы это в Microsoft Excel, но через SQL ...

Вот некоторые примеры данных:

if object_id('tempdb..#Temp') is not null
    drop table #Temp

create  table #Temp (id int, Field varchar(100), [Value] varchar(max),DCLink int)

insert into #Temp (id,Field,[Value],DCLink) values 

(1,'Name','ARABELLA',1800)
,(2,'Contact_Person','GRANGE',1800)
,(3,'Physical1','COUNTRY ESTATE',1800)
,(4,'Physical2','R67 DURBAN STR',1800)
,(5,'Physical3','CAPE TOWN',1800)
,(6,'Physical4','',1800)
,(7,'Physical5','',1800)
,(8,'PhysicalPC','',1800)
,(9,'Addressee','',1800)
,(10,'Post1','',1800)
,(11,'Post2','P O BOX 5493',1800)
,(12,'Post3','GROOTMOND',1800)
,(13,'Post4','',1800)
,(14,'Post5','',1800)
,(15,'PostPC','7195',1800)
,(16,'Delivered_To','PIET',1800)
,(17,'Telephone','029 428 0015',1800)
,(18,'Telephone2','028 428 0000',1800)
,(19,'Fax1','',1800)
,(20,'Fax2','',1800)
,(21,'Tax_Number','NOT TAX',1800)
,(22,'Registration','',1800)
,(23,'Credit_Limit','0',1800)
,(24,'On_Hold','0',1800)
,(25,'EMail','jan.fiskaal@arabella.com',1800)
,(26,'BranchCode','',1800)
,(27,'BankAccNum','',1800)
,(28,'CheckTerms','1',1800)
,(29,'cAccDescription','',1800)
,(30,'cWebPage','',1800)
,(31,'[Group]','C',1800)
,(32,'Area','WCA',1800)
,(33,'RepName','',1800)
,(34,'RepCode','',1800)
,(35,'BankName','',1800)
,(36,'PriceListName','Price List 1',1800)
,(37,'AgeCode','MNTH-STMT',1800)
,(38,'Name','BEACH ASSOCIATION',1602)
,(39,'Contact_Person','HARRY POTTER',1602)
,(40,'Physical1','3 BLUE HILLS DRIVE',1602)
,(41,'Physical2','BLUE HILLS',1602)
,(42,'Physical3','LOS ANGELES',1602)
,(43,'Physical4','',1602)
,(44,'Physical5','',1602)
,(45,'PhysicalPC','7441',1602)
,(46,'Addressee','',1602)
,(47,'Post1','',1602)
,(48,'Post2','PO BOX 237',1602)
,(49,'Post3','LOS ANGELES',1602)
,(50,'Post4','',1602)
,(51,'Post5','',1602)
,(52,'PostPC','7437',1602)
,(53,'Delivered_To','',1602)
,(54,'Telephone','031 678 0590',1602)
,(55,'Telephone2','',1602)
,(56,'Fax1','',1602)
,(57,'Fax2','031 678 0592',1602)
,(58,'Tax_Number','1234567890',1602)
,(59,'Registration','1765/4783/228',1602)
,(60,'Credit_Limit','0',1602)
,(61,'On_Hold','0',1602)
,(62,'EMail','Harry.Potter@beach.co.za',1602)
,(63,'BranchCode','',1602)
,(64,'BankAccNum','',1602)
,(65,'CheckTerms','1',1602)
,(66,'cAccDescription','',1602)
,(67,'cWebPage','',1602)
,(68,'[Group]','C',1602)
,(69,'Area','WCA',1602)
,(70,'RepName','',1602)
,(71,'RepCode','',1602)
,(72,'BankName','',1602)
,(73,'PriceListName','Price List 1',1602)

select
*
from    #Temp

Приведенные выше результаты выглядят так:

Sample Data

Вот что я пробовал:

select
*
,   c.*
from    ClientUpdateLog
cross apply
(
values
('Name',[Value])
,('Contact_Person',[Value])
,('Physical1',[Value])
,('Physical2',[Value])
,('Physical3',[Value])
,('Physical4',[Value])
,('Physical5',[Value])
,('PhysicalPC',[Value])
,('Addressee',[Value])
,('Post1',[Value])
,('Post2',[Value])
,('Post3',[Value])
,('Post4',[Value])
,('Post5',[Value])
,('PostPC',[Value])
,('Delivered_To',[Value])
,('Telephone',[Value])
,('Telephone2',[Value])
,('Fax1',[Value])
,('Fax2',[Value])
,('Tax_Number',[Value])
,('Registration',[Value])
,('Credit_Limit',[Value])
,('On_Hold',[Value])
,('EMail',[Value])
,('BranchCode',[Value])
,('BankAccNum',[Value])
,('CheckTerms',[Value])
,('cAccDescription',[Value])
,('cWebPage',[Value])
,('[Group]',[Value])
,('Area',[Value])
,('RepName',[Value])
,('RepCode',[Value])
,('BankName',[Value])
,('PriceListName',[Value])
,('AgeCode',[Value])
) c (
    Name
,   Contact_Person
,   Physical1
,   Physical2
,   Physical3
,   Physical4
,   Physical5
,   PhysicalPC
,   Addressee
,   Post1
,   Post2
,   Post3
,   Post4
,   Post5
,   PostPC
,   Delivered_To
,   Telephone
,   Telephone2
,   Fax1
,   Fax2
,   Tax_Number
,   Registration
,   Credit_Limit
,   On_Hold
,   EMail
,   BranchCode
,   BankAccNum
,   CheckTerms
,   cAccDescription
,   cWebPage
,   [Group]
,   Area
,   RepName
,   RepCode
,   BankName
,   PriceListName
,   AgeCode
)

Мне нужно транспонировать это будет выглядеть так:

Expected Results

Я не могу включить все ожидаемые результаты из-за пробела ...

У меня есть пробовал Cross Apply, но я все время застреваю.

Я не пробовал Pivot, как я думал, что это может сработать?

Ваша помощь будет оценена!

1 Ответ

1 голос
/ 21 февраля 2020

Вы пытаетесь использовать VALUES, чтобы удалить ваши данные, которые уже не развернуты. Вы также создаете табличную конструкцию VALUES с 2 столбцами, но затем утверждаете, что в ее определении 37.

Здесь вам нужна кросс-таблица / PIVOT. Лично я предпочитаю кросс-таблицу:

SELECT c.DCLink,
       MAX(CASE Field WHEN 'Name' THEN [Value] END) AS [Name],
       MAX(CASE Field WHEN 'Contact_Person' THEN [Value] END) AS [Contact_Person],
       MAX(CASE Field WHEN 'Physical1' THEN [Value] END) AS [Physical1],
       MAX(CASE Field WHEN 'Physical2' THEN [Value] END) AS [Physical2],
       MAX(CASE Field WHEN 'Physical3' THEN [Value] END) AS [Physical3],
       MAX(CASE Field WHEN 'Physical4' THEN [Value] END) AS [Physical4],
       MAX(CASE Field WHEN 'Physical5' THEN [Value] END) AS [Physical5],
       MAX(CASE Field WHEN 'PhysicalPC' THEN [Value] END) AS [PhysicalPC],
       MAX(CASE Field WHEN 'Addressee' THEN [Value] END) AS [Addressee],
       MAX(CASE Field WHEN 'Post1' THEN [Value] END) AS [Post1],
       MAX(CASE Field WHEN 'Post2' THEN [Value] END) AS [Post2],
       MAX(CASE Field WHEN 'Post3' THEN [Value] END) AS [Post3],
       MAX(CASE Field WHEN 'Post4' THEN [Value] END) AS [Post4],
       MAX(CASE Field WHEN 'Post5' THEN [Value] END) AS [Post5],
       MAX(CASE Field WHEN 'PostPC' THEN [Value] END) AS [PostPC],
       MAX(CASE Field WHEN 'Delivered_To' THEN [Value] END) AS [Delivered_To],
       MAX(CASE Field WHEN 'Telephone' THEN [Value] END) AS [Telephone],
       MAX(CASE Field WHEN 'Telephone2' THEN [Value] END) AS [Telephone2],
       MAX(CASE Field WHEN 'Fax1' THEN [Value] END) AS [Fax1],
       MAX(CASE Field WHEN 'Fax2' THEN [Value] END) AS [Fax2],
       MAX(CASE Field WHEN 'Tax_Number' THEN [Value] END) AS [Tax_Number],
       MAX(CASE Field WHEN 'Registration' THEN [Value] END) AS [Registration],
       MAX(CASE Field WHEN 'Credit_Limit' THEN [Value] END) AS [Credit_Limit],
       MAX(CASE Field WHEN 'On_Hold' THEN [Value] END) AS [On_Hold],
       MAX(CASE Field WHEN 'EMail' THEN [Value] END) AS [EMail],
       MAX(CASE Field WHEN 'BranchCode' THEN [Value] END) AS [BranchCode],
       MAX(CASE Field WHEN 'BankAccNum' THEN [Value] END) AS [BankAccNum],
       MAX(CASE Field WHEN 'CheckTerms' THEN [Value] END) AS [CheckTerms],
       MAX(CASE Field WHEN 'cAccDescription' THEN [Value] END) AS [cAccDescription],
       MAX(CASE Field WHEN 'cWebPage' THEN [Value] END) AS [cWebPage],
       MAX(CASE Field WHEN '[Group]' THEN [Value] END) AS [Group],
       MAX(CASE Field WHEN 'Area' THEN [Value] END) AS [Area],
       MAX(CASE Field WHEN 'RepName' THEN [Value] END) AS [RepName],
       MAX(CASE Field WHEN 'RepCode' THEN [Value] END) AS [RepCode],
       MAX(CASE Field WHEN 'BankName' THEN [Value] END) AS [BankName],
       MAX(CASE Field WHEN 'PriceListName' THEN [Value] END) AS [PriceListName],
       MAX(CASE Field WHEN 'AgeCode' THEN [Value] END) AS [AgeCode]
FROM #Temp c
GROUP BY c.DCLink;
...