Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 使用UNION ALL在单个表上使用简明语法折叠列_Mysql_Sql - Fatal编程技术网

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。