SQL将一行拆分为四行
我有一个SQL数据库,有七列,如下所示SQL将一行拆分为四行,sql,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;
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
有什么简单的方法可以做到这一点吗
提前感谢这将为您提供所需格式的输出:
SELECT version, year, name, '1', quarter_1 FROM table
UNION
SELECT version, year, name, '2', quarter_2 FROM table
UNION
...
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
这将为您提供所需格式的输出:
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
您可以使用四个季度对表进行交叉联接,然后使用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
您可以使用四个季度对表进行交叉联接,然后使用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
您可以创建sql视图。使用基于索引返回行的sql拆分函数。您可以从链接中获得一些帮助,您可以创建sql视图。使用基于索引返回行的sql拆分函数。您可以从链接中获得一些帮助您可以使用
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
您可以使用
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
没有提供DBMS,所以我将抛出几个特定于SQL Server的DBMS以防万一
-- 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
没有提供DBMS,所以我将抛出几个特定于SQL Server的DBMS以防万一
-- 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
为此,您可以使用
UNION ALL
或UNPIVOT
<代码>取消PIVOT在所有RDBMS上都不可用
UNION ALL
(请参阅):
UNPIVOT
(请参阅):
为此,您可以使用
UNION ALL
或UNPIVOT
<代码>取消PIVOT在所有RDBMS上都不可用
UNION ALL
(请参阅):
UNPIVOT
(请参阅):
哪个SQL?(我的SQL、SQL Server等)哪种SQL?(我的SQL、SQL Server等)