2012-08-30 80 views
0

我有七列SQL数据库如下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 

有没有简单的方法来做到这一点?

在此先感谢

+4

哪个SQL? (我的SQL,SQL Server等) – hims056

回答

0
SELECT version, year, name, '1', quarter_1 FROM table 

UNION 

SELECT version, year, name, '2', quarter_2 FROM table 

UNION 

... 
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 
0

你可以做一个交叉连接到一个表的四个季度中,然后使用一个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 
1

得到一些帮助,您可以使用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

0

没有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 
1

您可以使用一个UNION ALLUNPIVOT这一点。 UNPIVOT不适用于所有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