UNION查询会生成新行而不是新列

时间:2018-03-11 19:11:44

标签: mysql union

以下查询返回包含5列的结果( date,lowest_hr_price,max_hr_price,min_price,max_price)

而不是 (date,lowest_hr_price,max_hr_price,min_price,max_price,AvgPrice,AvgPieces)。

而是将AvgPrice和AvgPieces添加为行。

(select date(m.min_max_date) as date,
   max(case when m.lbl='min_hr_price' then m.min_max_hr_price else null end) as lowest_hr_price,
   max(case when m.lbl='max_hr_price' then m.min_max_hr_price else null end) as max_hr_price,
   max(case when n.lbl='min_price' then n.min_max_price else null end) as min_price,
   max(case when n.lbl='max_price' then n.min_max_price else null end) as max_price
from (select 'min_hr_price' as lbl, price as min_max_hr_price, date_time as min_max_date 
  from mytable 
  where date_time in (select min(date_time) as min_date from mytable group by date(date_time)) and symbol = 'dollar'
UNION 
select 'max_hr_price', price, date_time  
  from mytable WHERE symbol = 'dollar'
  AND date_time in (select max(date_time) as max_date from mytable WHERE symbol = 'dollar' group by date(date_time))) as m,
(
select 'min_price' as lbl,
min(date_time) as min_max_date,
min(price) as min_max_price
from mytable
    WHERE symbol = 'dollar'
group by date(date_time)
UNION
select 'max_price' as lbl,
max(date_time) as min_max_date,
max(price) as min_max_price
from mytable
    WHERE symbol = 'dollar'
group by date(date_time)
) n
where m.min_max_date=n.min_max_date
group by date(m.min_max_date)
order by m.min_max_date DESC
)
UNION
(SELECT null, null, date_time, avg (price) as AvgPrice, avg (pieces) as AvgPieces FROM mytable 
WHERE symbol = 'dollar'
group by date(date_time))

实际结果:

date       |lowest_hr_price |   max_hr_price    | min_price     | max_price     
------------------------------------------------------------------------------------
2018-03-06 |    1           |    2              | 0             | 10
NULL       | NULL           | {date}            | {avgprice}    | {avgpieces}

预期结果:

date       |lowest_hr_price |   max_hr_price    | min_price     | max_price | AvgPrice  | AvgPieces 
-------------------------------------------------------------------------------------------------------------
2018-03-06 |    1           |    2              | 0             | 10        | {avgprice}| {avgpieces}

1 个答案:

答案 0 :(得分:0)

如果您代替联合(选择行将一个选择附加到彼此),则需要在相同的行上获得所有结果 在这种情况下,您可以使用交叉连接,例如:

  select distinct * from (

  (select date(m.min_max_date) as date,
     max(case when m.lbl='min_hr_price' then m.min_max_hr_price else null end) as lowest_hr_price,
     max(case when m.lbl='max_hr_price' then m.min_max_hr_price else null end) as max_hr_price,
     max(case when n.lbl='min_price' then n.min_max_price else null end) as min_price,
     max(case when n.lbl='max_price' then n.min_max_price else null end) as max_price
  from (select 'min_hr_price' as lbl, price as min_max_hr_price, date_time as min_max_date 
    from mytable 
    where date_time in (select min(date_time) as min_date from mytable group by date(date_time)) and symbol = 'dollar'
  UNION 
  select 'max_hr_price', price, date_time  
    from mytable WHERE symbol = 'dollar'
    AND date_time in (select max(date_time) as max_date from mytable WHERE symbol = 'dollar' group by date(date_time))) as m,
  (
  select 'min_price' as lbl,
  min(date_time) as min_max_date,
  min(price) as min_max_price
  from mytable
      WHERE symbol = 'dollar'
  group by date(date_time)
  UNION
  select 'max_price' as lbl,
  max(date_time) as min_max_date,
  max(price) as min_max_price
  from mytable
      WHERE symbol = 'dollar'
  group by date(date_time)
  ) n
  where m.min_max_date=n.min_max_date
  group by date(m.min_max_date)
  order by m.min_max_date DESC
  ) ) T1 INNER join 

  (SELECT null, null, date_time, avg (price) as AvgPrice, avg (pieces) as AvgPieces FROM mytable 
  WHERE symbol = 'dollar'
  group by date(date_time))  T2  ON date(T1.date) = date(T2.date_time)