如何将结果集中的单行表示为多行?

Eug*_*ash 1 mysql sql

例如,给出了具有这些列的货币汇率表(在这里使用3,但在我的情况下,大约有30个):

  date     | eur | usd | gbp
2010-01-28 | X   | Y   | Z
Run Code Online (Sandbox Code Playgroud)

如何将其转换为此(使用具有最新日期的行):

currency | rate
eur      | X
usd      | Y
gbp      | Z
Run Code Online (Sandbox Code Playgroud)

我想出了这样的查询:

SELECT 'eur' AS currency, eur AS rate FROM rates WHERE date = (SELECT MAX(date) FROM rates)
UNION
SELECT 'usd' AS currency, usd AS rate FROM rates WHERE date = (SELECT MAX(date) FROM rates)
UNION
...
Run Code Online (Sandbox Code Playgroud)

这是巨大而丑陋的.还有其他解决方案吗?

pax*_*blo 5

有时最简单的解决方案(如果您需要漂亮的查询)是重新设计架构.可能最好的解决方案是将您的表格更改为:

   date    | currency | rate
-----------+----------+-----
2010-01-28 |   eur    |  X
2010-01-28 |   usd    |  Y
2010-01-28 |   gbp    |  Z
Run Code Online (Sandbox Code Playgroud)

具有合适的日期和货币指数以表现.由于费率相互依赖,违反3NF规则,因此它应该在3NF中应该是这样的:

每一栏都必须依靠钥匙,整个钥匙和钥匙,所以请帮助我Codd.

(我喜欢那个小曲子).另一种方法是提供一个视图,它执行相同的操作,然后查询视图.这对于DBMS来说同样重要,但你的查询至少看起来更漂亮(create view尽管看起来仍然看起来很丑陋).

或者你可以接受这样一个事实:一些查询看起来很难看,记录得很好,继续前进:-)