транспонировать столбец в строки из определенного слова - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть данные в листе Excel, как это:

Number               123456
name                 John
province             Quebec 
Number               458965
name                 sammy
province             ontario

Я хочу переместить данные в строки.

Я хочу сделать это в SQL server, импортировав файл excel.

Теперь я ищу запрос SQL, который может дать мне вывод, как показано ниже. Один из подходов может заключаться в том, что когда запрос обнаруживает имя поля Number, он должен транспонировать данные в строки до появления следующего поля Number. Вывод показан ниже.

Number    name   province  client type

1 Ответ

0 голосов
/ 25 апреля 2019

Я уверен, что есть более эффективный способ сделать это, но как только вы поместите свои данные в SQL во временную таблицу (я просто взломал метод, чтобы сделать это, что вы могли бы сделать из своей книги Excel, генерируя операторы вставки если у вас нет другого более легкого пути) ...

DECLARE @tblData TABLE
(
    iRowNo      int identity(1,1),
    sField      nvarchar(100),
    sValue      nvarchar(1000)
)

INSERT INTO @tblData VALUES ('Number', '123456')
INSERT INTO @tblData VALUES ('name', 'John')
INSERT INTO @tblData VALUES ('province', 'Quebec')
INSERT INTO @tblData VALUES ('client', 'Client 1')
INSERT INTO @tblData VALUES ('type', 'Type 1')
INSERT INTO @tblData VALUES ('Number', '458965')
INSERT INTO @tblData VALUES ('name', 'sammy')
INSERT INTO @tblData VALUES ('province', 'ontario')
INSERT INTO @tblData VALUES ('client', 'Client 2')
INSERT INTO @tblData VALUES ('type', 'Type 2')

... вы можете попробовать следующий запрос ...

SELECT iRowNo, sValue AS Number,
    Name = (SELECT TOP (1) B.sValue FROM @tblData AS B WHERE B.sField = 'name' AND B.iRowNo > A.iRowNo ORDER BY iRowNo),
    Province = (SELECT TOP (1) B.sValue FROM @tblData AS B WHERE B.sField = 'province' AND B.iRowNo > A.iRowNo ORDER BY iRowNo),
    Client = (SELECT TOP (1) B.sValue FROM @tblData AS B WHERE B.sField = 'client' AND B.iRowNo > A.iRowNo ORDER BY iRowNo),
    Type = (SELECT TOP (1) B.sValue FROM @tblData AS B WHERE B.sField = 'type' AND B.iRowNo > A.iRowNo ORDER BY iRowNo)
FROM @tblData AS A
WHERE sField = 'Number'

... что дало мне следующий результат ...

enter image description here

... не уверен, поможет ли это, но исходя из того, что вы спрашивали, я думаю, что это результат, который вы ищете.

Должен признать, что 8 лет назад я много занимался вопросами SQL, поэтому, возможно, есть лучший способ получить ваш ответ в этот новый день и эпоху, или, может быть, всегда. : -)

В любом случае, стоит попробовать ...!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...