我有一张包含这些数据的表:
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
我该如何根据需要订购此数据?这是一个容易理解的问题!
答案 0 :(得分:2)
在SQL Server中使用Unpivot:
select date, hvalue
from student
unpivot
(
hvalue
for val in (hour1, hour2, hour3)
) u
答案 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;