【问题标题】:Basic UNION or JOIN基本 UNION 或 JOIN
【发布时间】:2015-11-11 16:36:31
【问题描述】:

我已经制定了一些查询来提取我想要的数据,但我似乎无法将它们放在一起。我想将所有信息放在一张表中。

SELECT MarketIdentifier, CurveType, VintageYear, Rate = Avg(RateValue) FROM #RateCurves GROUP BY MarketIdentifier, CurveType, VintageYear ORDER BY MarketIdentifier, CurveType, VintageYear

SELECT MarketIdentifier, CurveType, VintageYear, Obligation = Avg(ObligationValue) FROM #ObligationCurves GROUP BY MarketIdentifier, CurveType, VintageYear ORDER BY MarketIdentifier, CurveType, VintageYear

以上两个 select 语句生成两个不同的表,其中一个具有以下标题:

MarketIdentifier, CurveType, VintageYear, Rate

另一个:

MarketIdentifier, CurveType, VintageYear, Obligation

我只是希望输出是:

MarketIdentifier, CurveType, VintageYear, Obligation, Rate

我尝试了多种不同的 JOIN、UNION、UNION ALL 组合等。其中一些会产生所需的表格格式,但值不正确。我确定这是我所缺少的非常基本的东西。

【问题讨论】:

  • MarketIdentifier、CurveType、VintageYear 在所有行上都相同吗?
  • 你能展示一些示例数据吗?两个表中的 MarketIdentifier、CurveType 和 VintageYear 是否相同 - 如果我获得相同 MarketIdentifier、CurveType 和 VintageYear 的 rateValue 和 ObligationValue,它们是否引用相同的逻辑实体?

标签: sql union


【解决方案1】:

一种方法是将group by 结果放在派生表t1t2 中,然后按您要分组的列进行连接。

以下查询假定两个查询对于每个 (MarketIdentifier、CurveType、VintageYear) 组合都有 1 行。即不会有一个 (MarketIdentifier, CurveType, VintageYear) 在一个表中但不在另一个表中。否则,您必须根据需要的行进行左连接或完全连接。

select * from (
    your first query here
) t1 inner join (
    your second query here
) t2 on t2.MarketIdentifier = t1.MarketIdentifier
and t2.CurveType = t1.CurveType
and t2.VintageYear = t1.VintageYear

【讨论】:

  • 这成功了!唯一的问题是它重复了 MarketIdentifier、CurveType 和 VintageYear 列。不管这是否适合我的目的,也许我可以弄清楚如何摆脱重复的列。
  • 我发现 - 只需要选择特定的列而不是选择 *。谢谢!
【解决方案2】:

您需要在两个句子中具有相同的字段。试试看:

SELECT MarketIdentifier, CurveType, VintageYear, NULL as Obligation , Rate = Avg(RateValue) 
FROM #RateCurves 
GROUP BY MarketIdentifier, CurveType, VintageYear 
ORDER BY MarketIdentifier, CurveType, VintageYear
UNION
SELECT MarketIdentifier, CurveType, VintageYear, Obligation = Avg(ObligationValue), NULL as Rate
FROM #ObligationCurves 
GROUP BY MarketIdentifier, CurveType, VintageYear 
ORDER BY MarketIdentifier, CurveType, VintageYear;

【讨论】:

  • 在删除第一个 ORDER BY 后,这行得通,但将所有行加倍,并为 Rate 或 Obligation 列出 NULL,具体取决于哪个显示值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 2013-10-02
相关资源
最近更新 更多