为包含多列数据的每个单元格创建一行

时间:2014-09-05 09:12:59

标签: sql excel tsql normalization unpivot

我正在处理从调查中生成的数据,该调查具有唯一的响应者ID作为第一列,然后有多个列与受访者在寻找员工方面所关注的国家/地区的选择相关。所以我的表看起来像:

RespondentID  Andorra  Austria  Belgium  Cyprus  Denmark  Finland  France   

2546078180    Andorra  NULL     NULL     Cyprus  NULL     NULL     NULL 
2546077668    NULL     NULL     Belgium  NULL    NULL     NULL     NULL 
2546077120    NULL     NULL     NULL     NULL    Denmark  Finland  NULL 

我最终想要的是一个表格,其中列出了给出的每个答案的响应者ID。所以在上面的数据看起来像:

RespondentID  Country   

2546078180    Andorra
2546078180    Cyprus
2546077668    Belgium
2546077120    Denmark
2546077120    Finland   

因为这应该允许我创建一个表格,详细说明受访者所关联的国家/地区,然后我可以将此表格加入到其他响应中,这些响应主要是是/否或单个答案,我们需要对数据进行报告

这些数据是通过Excel电子表格传入的,因此如果需要或更好的话,在导入SQL之前进行一些格式化也是可以接受的。

2 个答案:

答案 0 :(得分:1)

使用UNPIVOT来规范化您的表格:

SELECT u.RespondentID, u.Country
FROM @source
UNPIVOT (Country FOR c IN (Andorra, Austria, Belgium, Cyprus, Denmark, Finland, France)) u

@source是一个包含从Excel工作表导入的数据的表。

测试数据:

DECLARE @source TABLE
(
    RespondentID BIGINT NOT NULL,
    Andorra VARCHAR(25),
    Austria VARCHAR(25),
    Belgium VARCHAR(25),
    Cyprus VARCHAR(25),
    Denmark VARCHAR(25),
    Finland VARCHAR(25),
    France VARCHAR(25)
)

INSERT INTO @source 
(RespondentID, Andorra,   Austria, Belgium,  Cyprus,   Denmark,    Finland,   France)
VALUES
(2546078180,   'Andorra', NULL,    NULL,     'Cyprus', NULL,       NULL,      NULL),
(2546077668,   NULL,      NULL,    'Belgium', NULL,    NULL,       NULL,      NULL),
(2546077120,   NULL,      NULL,    NULL,      NULL,    'Denkmark', 'Finland', NULL)

-- I assume that 'NULL' cell values from your Excel sheet become NULL during the import.

<强>输出:

RespondentId         Country
-------------------- -------------------------
2546078180           Andorra
2546078180           Cyprus
2546077668           Belgium
2546077120           Denkmark
2546077120           Finland

答案 1 :(得分:0)

UNION子句是要走的路:

  SELECT * FROM (
    SELECT RespondentID, Field1 as Country
    FROM myTable
    UNION
    SELECT RespondentID, Field2 as Country
    FROM myTable
    UNION
    ....
    UNION
    SELECT RespondentID, Fieldn as Country
    FROM myTable) t
  WHERE Country IS NOT NULL