如何在Oracle中将垂直查询结果改为水平查询[duplicate]

6ss1mwsb  于 2023-10-16  发布在  Oracle
关注(0)|答案(2)|浏览(136)

此问题已在此处有答案

Oracle SQL pivot query(4个答案)
上个月关门了。
这是一个包含许多连接的复杂查询的结果:enter image description here
我想要的是:enter image description here
我该如何实现这一点?
我尝试使用pivot,但我不想聚合任何东西。

u3r8eeie

u3r8eeie1#

这将帮助你找到正确的逻辑。您需要使用嵌套选择。

  1. SELECT id,
  2. visit,
  3. date,
  4. weight,
  5. height
  6. FROM (SELECT id,
  7. visit,
  8. date,
  9. Sum(weight) AS weight,
  10. 0 AS height
  11. FROM table
  12. WHERE type = weight
  13. GROUP BY id,
  14. visit,
  15. date
  16. UNION ALL
  17. SELECT id,
  18. visit,
  19. date,
  20. 0 AS weight,
  21. Sum(height) AS height
  22. FROM table
  23. WHERE type = height
  24. GROUP BY id,
  25. visit,
  26. date);
展开查看全部
w9apscun

w9apscun2#

您正在处理一个EAV表,Member_id、Visit_no和Date的组合是实体,Type是属性,Value是值。
一种选择是聚合数据,以便从四个源行获得两个结果行。

  1. select
  2. member_id, visit_no, date,
  3. max(case when type = 'weight' then value end) as weight,
  4. max(case when type = 'height' then value end) as height
  5. from mytable
  6. group by member_id, visit_no, date
  7. order by member_id, visit_no, date;

这被称为“条件聚合”,因为我们在条件上聚合。组中具有属性“weight”的所有行的最大值只是一个权重值,因为每个组和属性只有一行。这就是为什么你说你没有聚合,但在SQL中,这是一个聚合,我们必须使用MINMAX(如果我们想混淆读者,甚至可以使用SUMAVG)来获得一个值。
PIVOT子句也可以这样做。
另一种方法是将这两个数据集,一个用于重量,一个用于高度,然后连接:

  1. with
  2. weights as
  3. (
  4. select member_id, visit_no, date, value as weight
  5. from mytable
  6. where type = 'weight'
  7. ),
  8. heights as
  9. (
  10. select member_id, visit_no, date, value as height
  11. from mytable
  12. where type = 'height'
  13. )
  14. select *
  15. from weights full outer join heights using (member_id, visit_no, date)
  16. order by member_id, visit_no, date;
展开查看全部

相关问题