首页 > 解决方案 > 将列转换为特定单词的行

问题描述

我在这样的excel表中有数据:

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

我想将数据转换成行。

我想SQL server通过导入excel文件来做到这一点。

现在我正在寻找一个 SQL 查询,它可以给我如下所示的输出。一种方法是,当查询检测到Number字段名称时,它应该将数据转换为行,直到Number出现下一个字段。输出如下所示。

Number    name   province  client type

标签: sqlsql-serverexcelexcel-formulatranspose

解决方案


我确信有一种更有效的方法可以做到这一点,但是一旦您将 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'

...这给了我以下结果...

在此处输入图像描述

...不确定这是否有帮助,但根据您的要求,我认为这就是您正在寻找的结果。

我不得不承认,大约 8 年前,我对 SQL 方面的事情很感兴趣,所以在这个新的时代,或者可能永远有更好的方法来得到你的答案。:-)

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


推荐阅读