【问题标题】:SQL split one row in to four rowsSQL 将一行拆分为四行
【发布时间】:2012-08-31 00:33:55
【问题描述】:

我有一个包含七列的 SQL 数据库,如下所示

version1; 1993; name; 233; 254; 291; 244
version1; 1994; name; 333; 354; 391; 344 

最后四列代表季度值,我想每行挑出一个值,所以每行提取为四行。此外,我想添加一个值(跟踪提供的季度的列)。希望是上面的两个数据行报告为

version1; 1993; 1; name, 233
version1; 1993; 2; name; 254
version1; 1993; 3; name; 291
version1; 1993; 4; name; 244
version1; 1994; 1; name, 333
version1; 1994; 2; name; 354
version1; 1994; 3; name; 391
version1; 1994; 4; name; 344

有什么简单的方法吗?

提前致谢

【问题讨论】:

  • 哪个 SQL? (My SQL、SQL Server 等)

标签: sql


【解决方案1】:

这将为您提供所需格式的输出:

SELECT version, year, 1 as 'quarter', name, quarter1_value 
FROM myTable

UNION

SELECT version, year, 2 as 'quarter', name, quarter2_value 
FROM myTable

UNION

SELECT version, year, 3 as 'quarter', name, quarter3_value 
FROM myTable

UNION

SELECT version, year, 4 as 'quarter', name, quarter4_value 
FROM myTable

【讨论】:

    【解决方案2】:

    您可以为此使用UNION ALLUNPIVOTUNPIVOT 并非在所有 RDBMS 上都可用。

    UNION ALL(见SQL Fiddle with Demo):

    select col1, col2, col3, 1 quarter, col4
    from yourtable
    union all
    select col1, col2, col3, 2 quarter, col5
    from yourtable
    union all
    select col1, col2, col3, 3 quarter, col6
    from yourtable
    union all
    select col1, col2, col3, 4 quarter, col7
    from yourtable
    

    UNPIVOT(见SQL Fiddle with Demo):

    select col1, col2, col3, 
      cast(replace(field, 'col', '') as int) - 3 quarter, 
    value
    from 
    (
      select col1, col2, col3, col4, col5, col6, col7
    
      from yourtable
    ) u
    unpivot
    (
      value 
      for field in (col4, col5, col6, col7)
    )u
    

    【讨论】:

      【解决方案3】:

      您可以使用UNION 来实现您想要的结果。这适用于 MySQL 和 SQL Server。你可以像这样使用UNION

      SELECT * FROM
      (
      SELECT version, year, 1 as 'quarter', name, quarter1_value FROM tt
      UNION
      SELECT version, year, 2 as 'quarter', name, quarter2_value FROM tt
      UNION
      SELECT version, year, 3 as 'quarter', name, quarter3_value FROM tt
      UNION
      SELECT version, year, 4 as 'quarter', name, quarter4_value FROM tt
      ) a
      Order by Year, QUARTER
      

      See this SQLFiddle

      【讨论】:

        【解决方案4】:
        SELECT version, year, name, '1', quarter_1 FROM table
        
        UNION
        
        SELECT version, year, name, '2', quarter_2 FROM table
        
        UNION
        
        ...
        

        【讨论】:

          【解决方案5】:

          您可以对包含四个季度的表进行交叉连接,然后使用 case 语句选择适当的季度:

          SELECT
            ORIG_TABLE.VERSION,
            ORIG_TABLE.YEAR,
            QUARTER_NAMES.Q_NAME,
            ORIG_TABLE.NAME,
            CASE QUARTER_NAMES.Q_NAME
              WHEN 1 
                THEN ORIG_TABLE.Q1_VALUE
              WHEN 2
                THEN ORIG_TABLE.Q2_VALUE
              WHEN 3
                THEN ORIG_TABLE.Q3_VALUE
              WHEN 4
                THEN ORIG_TABLE.Q4_VALUE
           END Q_VALUE
          FROM
            ORIG_TABLE
              CROSS JOIN 
              (
                 SELECT 1 Q_NAME
                 UNION SELECT 2 Q_NAME
                 UNION SELECT 3 Q_NAME
                 UNION SELECT 4 Q_NAME
              ) QUARTER_NAMES
          

          【讨论】:

            【解决方案6】:

            您可以创建一个 sql 视图。使用 sql split 函数,它根据索引返回一行。您可以通过链接http://geekswithblogs.net/AngelEyes/archive/2007/04/12/111504.aspx获得一些帮助

            【讨论】:

              【解决方案7】:

              没有提供 DBMS,所以我将抛出几个特定于 SQL-Server 的数据库以防万一。

              -- SAMPLE DATA
              DECLARE @T TABLE (Version VARCHAR(15), Year INT, Name VARCHAR(5), Col1 INT, Col2 INT, Col3 INT, Col4 INT)
              INSERT @T VALUES
                  ('version1', 1993, 'name', 233, 254, 291, 244),
                  ('version1', 1994, 'name', 333, 354, 391, 344)
              
              -- CROSS APPLY VALUES
              SELECT  Version, Year, RowNum, Name, Value
              FROM    @T
                      CROSS APPLY 
                      (   VALUES 
                              (Col1, 1), 
                              (Col2, 2), 
                              (Col3, 3), 
                              (Col4, 4)
                      ) t (Value, RowNum)
              
              -- UNPIVOT
              SELECT  Version, Year, REPLACE(RowNum, 'Col', '') [RowNum], Name, Value
              FROM    @T
                      UNPIVOT
                      (   Value
                          FOR RowNum IN ([Col1], [Col2], [Col3], [Col4])
                      ) upvt
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-08-25
                • 2016-04-10
                • 2014-09-06
                • 1970-01-01
                • 1970-01-01
                • 2021-12-07
                相关资源
                最近更新 更多