在SQL中按列排序

时间:2018-09-07 03:59:29

标签: sql sql-server

我有一张包含这些数据的表:

hour1 | hour2 | hour3 | date
h1      h2      h3      d1
h4      h5      h6      d2

无论值如何(不使用order by),我都想使用查询按以下顺序显示它们:

h_value | date
h1        d1
h2        d1
h3        d1
h4        d2
h5        d2
h6        d2

我尝试了很多查询和语句,例如union,join等...,但是它们都不起作用。我尝试过的最后一个代码:

SELECT test.h1 as h_value,
        test.h2 as h_value,
        test.h3 as h_value,
        test.date
      FROM test

此代码的结果是:

h_value| h_value| h_value| date
h1       h2       h3       d1
h4       h5       h6       d2

有解决方案吗? (注意:忽略表数据,仅按指定列的顺序:

h_value | date
row1col1  date1
row1col2  date1
row1col3  date1
row2col1  date2
row2col2  date2
row2col3  date2

我希望你明白我的意思)

编辑1 看,我的表上数据如下:

hour1 | hour2 | hour3 | date
5:00    7:00    4:00    2018/10/09
3:30    8:00    4:00    2018/09/20
7:00    9:00    6:00    2018/11/10

我该如何根据需要订购此数据?这是一个容易理解的问题!

3 个答案:

答案 0 :(得分:2)

在SQL Server中使用Unpivot:

    select date, hvalue
from student
unpivot
(
  hvalue
  for val in (hour1, hour2, hour3)
) u

http://sqlfiddle.com/#!18/2e0d2/2

答案 1 :(得分:2)

对于SQL Server,您可以像这样使用unpivot

SELECT h_value, adate
FROM   
   (SELECT h1,h2,h3,adate
   FROM test) p  
UNPIVOT  
   (h_value FOR src IN   
      (h1,h2,h3)  
)AS unpvt
order by adate, h_value;  

但是您保留了SQL 需要使用order by来保证有序结果的问题。


原始建议(当db被列为MySQL时)

SELECT
    test.h1 AS h_value, test.date
FROM test
UNION ALL
SELECT
    test.h2 AS h_value, test.date
FROM test
UNION ALL
SELECT
    test.h3 AS h_value, test.date
FROM test
ORDER BY
    h_value, date

答案 2 :(得分:1)

我强烈希望使用cross apply而不是unpivot进行透视。基本上,apply非常强大,可以做很多事情。这是了解该功能的好方法。

但是,如果要按特定顺序显示结果,则必须使用order by 。 SQL表和结果集表示无序集。除非您明确要求,否则没有顺序。

所以,我会去:

select s.date, h.h_value
from student s cross apply
     (values (hour1, 1), (hour2, 2), (hour3, 3)
     ) h(hour, ord)
order by s.date, h.ord;