代码之家  ›  专栏  ›  技术社区  ›  user3318535

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

  •  1
  • user3318535  · 技术社区  · 10 年前

    我处理的是从一项调查中生成的数据,该调查的第一列是唯一的受访者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 回复  |  直到 10 年前
        1
  •  1
  •   stakx - no longer contributing Saravana Kumar    10 年前

    使用 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
    
        2
  •  0
  •   Bulat    10 年前

    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