Mysql 使用UNION ALL在单个表上使用简明语法折叠列
表格:Mysql 使用UNION ALL在单个表上使用简明语法折叠列,mysql,sql,Mysql,Sql,表格: +--------+-------------+-------------+ | TIME | TYPE_X | TYPE_Y | |--------|-------------|-------------| | T1 | VAL_X_1 | VAL_Y_1 | | T2 | VAL_X_2 | VAL_Y_2 | +--------v-------------v-------------+
+--------+-------------+-------------+
| TIME | TYPE_X | TYPE_Y |
|--------|-------------|-------------|
| T1 | VAL_X_1 | VAL_Y_1 |
| T2 | VAL_X_2 | VAL_Y_2 |
+--------v-------------v-------------+
+--------+-------------+-------------+
| TIME | TYPE | VAL |
|--------|-------------|-------------|
| T1 | TYPE_X | VAL_X_1 |
| T2 | TYPE_X | VAL_X_2 |
| T1 | TYPE_Y | VAL_Y_1 |
| T2 | TYPE_Y | VAL_Y_2 |
+--------v-------------v-------------+
所需输出:
+--------+-------------+-------------+
| TIME | TYPE_X | TYPE_Y |
|--------|-------------|-------------|
| T1 | VAL_X_1 | VAL_Y_1 |
| T2 | VAL_X_2 | VAL_Y_2 |
+--------v-------------v-------------+
+--------+-------------+-------------+
| TIME | TYPE | VAL |
|--------|-------------|-------------|
| T1 | TYPE_X | VAL_X_1 |
| T2 | TYPE_X | VAL_X_2 |
| T1 | TYPE_Y | VAL_Y_1 |
| T2 | TYPE_Y | VAL_Y_2 |
+--------v-------------v-------------+
我想出的方法使用了联合所有的(这是可行的)
但是,重复的WHERE
子句和查询的大小是一个问题,因为我要处理更多的字段。我想提出一个简洁的问题。
有人能帮我一下吗?我可以给出这个解决方案,它将为您提供所需的结果,并且易于理解和管理,以便以后添加一些字段,甚至更快
select
TIME,
if (temp.row_n=1,t.TYPE_X,t.TYPE_Y) as TYPE,
if (temp.row_n=1,t.TYPE_X,t.TYPE_Y) as VAL
from t,
(select 1 as row_n
union
select 2 as row_n) temp
select time, type , val
from(
select
TIME,
CASE when TYPE_X = 'VAL_X_1' OR TYPE_X = 'VAL_X_2' then 'TYPE_X' end as TYPE,
CASE when TYPE_X = 'VAL_X_1' OR TYPE_X = 'VAL_X_2' then TYPE_X end as Val
from Table1
UNION
select
TIME,
CASE when TYPE_Y = 'VAL_Y_1' OR TYPE_Y = 'VAL_Y_2' then 'TYPE_Y' end as TYPE,
CASE when TYPE_Y = 'VAL_Y_1' OR TYPE_Y = 'VAL_Y_2' then TYPE_Y end as Val
from Table1
)t
您确定T1的预期结果是VAL_Y_2吗?我不明白-您想要输出什么?@echo_Me typo。修正了。如果采用联接方式,那么是否需要一个大的条件if来选择为每个联接表选择的列?这既不简洁也不可读,这是由于数据库设计不佳或试图在SP编程或应用程序如何处理数据方面偷懒造成的。要么将模式转换为链接到时间的键/值对,要么编写一个SP来处理多个查询并以您希望的方式返回结果。一个查询并不能真正提高它的效率,只是更难阅读。这会更好(而且看起来更快)。我要回答这个问题。谢谢@DarkCthulhu希望这对您有所帮助。但我无法打开VAL_Y_1
,因为我显示的表格仅具有代表性。但是我理解使用CASE的一般方法,所以+1。