如何在sql中垂直显示字段而不是水平显示字段

时间:2014-04-03 18:17:38

标签: sql sql-server-2008-r2 unpivot

我有这个查询

 select 
raw_item_no, 
raw_item_no_2,
raw_item_no_3,
raw_item_no_4 
from jtjobfil_sql 
where job_no = 213418

这样的输出

raw_item_no    raw_item_no_2  raw_item_no_3  raw_item_no_4
 23              24              25               26

如何让输出看起来像这样

raw_item_nos
23
24
25
26

我调查了枢轴,但我无法弄清楚如何做到这一点因为我没有总结任何列。

4 个答案:

答案 0 :(得分:2)

你可以用联盟做点什么。

with my_query (column1, column2, column3)
as 
(
    SELECT column1, column2, column3
    FROM my_table
    where id = 1
)
SELECT column1 FROM my_query
UNION
SELECT column2 FROM my_query
UNION
SELECT column3 FROM my_query

答案 1 :(得分:2)

您可以使用CROSS APPLY

SELECT x.raw_item_nos
FROM jtjobfil_sql  t
CROSS APPLY 
(
    VALUES
        (t.raw_item_no),
        (t.raw_item_no_2),
        (t.raw_item_no_3),
        (t.raw_item_no_4)
) X (raw_item_nos)
WHERE job_no = 213418;

答案 2 :(得分:2)

在您的情况下,您只需要UNPIVOT和列列表。

查询非常简单

 SELECT P AS raw_item_no
    FROM (
           SELECT raw_item_no
               ,raw_item_no_2
               ,raw_item_no_3
               ,raw_item_no_4
            FROM jtjobfil_sql
            WHERE job_no = 213418
         ) p UNPIVOT ( p FOR value IN ( raw_item_no, raw_item_no_2, raw_item_no_3, raw_item_no_4 ) ) AS unvpt

这里是UNPIVOT

的示例数据和示例
 DECLARE @table TABLE
    (
     raw_item_no INT
    ,raw_item_no_2 INT
    ,raw_item_no_3 INT
    ,raw_item_no_4 INT
    )

 INSERT INTO @table
    VALUES ( 23, 24, 25, 26 )

 SELECT P AS raw_item_no
    FROM (
           SELECT raw_item_no
               ,raw_item_no_2
               ,raw_item_no_3
               ,raw_item_no_4
            FROM @table
     ) p UNPIVOT ( p FOR value IN ( raw_item_no, raw_item_no_2, raw_item_no_3, raw_item_no_4 ) ) AS unvpt

答案 3 :(得分:0)

您也可以使用此技巧仅解决特定名称

这也是处理此类Question的一种逻辑,但这是冗长的代码

SELECT  substr(ename,1,1) FROM  employees WHERE ENAME='JAMES'
UNION ALL
select  substr(ename,2,1) from employees WHERE ENAME= 'JAMES'
UNION ALL
select  substr(ename,3,1) from employees WHERE ENAME= 'JAMES'
UNION ALL
select  substr(ename,4,1) from employees WHERE ENAME= 'JAMES'
UNION ALL 
select  substr(ename,5,1) from employees WHERE ENAME= 'JAMES'