将列从特定单词转置为行

时间:2019-04-25 05:23:03

标签: sql sql-server excel excel-formula transpose

我在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 :(得分:0)

我敢肯定有一种更有效的方法,但是一旦在临时表中将数据存储在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方面很沉重,因此在这个新的时代可能有更好的方法,或者也许总是这样。 :-)

无论如何,值得一试...!