【问题标题】:How to join on distinct sub query in SQL Server如何在 SQL Server 中加入不同的子查询
【发布时间】:2014-01-24 00:38:35
【问题描述】:

我有一个想要更改的 SQL 查询,但我担心我的 SQL foo 不够好,无法解决这个问题。

所以,我有以下查询..

DECLARE @OldestSettlementDate DATETIME;
DECLARE @NewestSettlementDate DATETIME;

SET @OldestSettlementDate = '2014-01-05 12:00';
SET @NewestSettlementDate = '2014-01-05 12:00';

SELECT SETTLEMENTDATE, REGIONID, FUEL_TYPE, SUM(SCADAVALUE) AS TOTAL_GENERATION
FROM
    (SELECT SCADA.SETTLEMENTDATE, DETAIL.REGIONID, COALESCE(FUEL.AEMO_FUEL_TYPE, 'Other') AS FUEL_TYPE, SCADA.SCADAVALUE
     FROM DISPATCH_UNIT_SCADA AS SCADA
     LEFT JOIN GR_DUID_TO_FUEL_TYPE AS FUEL ON FUEL.DUID = SCADA.DUID
     LEFT JOIN DUDETAILSUMMARY AS DETAIL ON DETAIL.DUID = SCADA.DUID
     AND SCADA.SETTLEMENTDATE BETWEEN DETAIL.START_DATE AND DETAIL.END_DATE
WHERE SCADA.SETTLEMENTDATE BETWEEN @OldestSettlementDate AND @NewestSettlementDate)
AS X
GROUP BY SETTLEMENTDATE, REGIONID, FUEL_TYPE
ORDER BY SETTLEMENTDATE DESC, REGIONID, FUEL_TYPE

目前它正在返回这样的结果..

SETTLEMENTDATE  REGIONID    FUEL_TYPE       TOTAL_GENERATION
2014-01-05 12:00:00.000 NSW1    Black Coal  5593.876490
2014-01-05 12:00:00.000 NSW1    Hydro       115.674860
2014-01-05 12:00:00.000 NSW1    Liquid Fuel 0.000000
2014-01-05 12:00:00.000 NSW1    Natural Gas 475.541690
2014-01-05 12:00:00.000 NSW1    Other       152.471500
2014-01-05 12:00:00.000 NSW1    Wind        153.175650
2014-01-05 12:00:00.000 QLD1    Black Coal  5176.610039
2014-01-05 12:00:00.000 QLD1    Hydro       40.795000
2014-01-05 12:00:00.000 QLD1    Liquid Fuel 0.000000
2014-01-05 12:00:00.000 QLD1    Natural Gas 1402.728840
2014-01-05 12:00:00.000 QLD1    Other   51.254405
2014-01-05 12:00:00.000 SA1 Brown Coal  274.644050
2014-01-05 12:00:00.000 SA1 Liquid Fuel 0.000000
2014-01-05 12:00:00.000 SA1 Natural Gas 365.815960
2014-01-05 12:00:00.000 SA1 Other       82.600000
2014-01-05 12:00:00.000 SA1 Wind        968.568336

问题是,我希望在每个结算日期和地区都显示所有燃料类型。例如,Brown Coal 应该出现在 NSW1 中,总代数为 0。

2014-01-05 12:00:00.000 NSW1    Brown Coal       0.000000

我知道我可能必须加入以下子查询,但我不确定它如何适合上述查询。

SELECT DISTINCT AEMO_FUEL_TYPE AS FUEL_TYPE
FROM GR_DUID_TO_FUEL_TYPE

谢谢。

【问题讨论】:

  • 相当不幸的串联:“DUDETAILSUMMARY”
  • 哈哈。是的,这不是我们的数据库模式。我们只需要在我们的软件中使用它。

标签: sql sql-server join subquery


【解决方案1】:

从您的燃料类型列表开始:

WITH FUEL_TYPES AS (
   SELECT DISTINCT AEMO_FUEL_TYPE AS FUEL_TYPE
   FROM GR_DUID_TO_FUEL_TYPE
)

以及您的日期和地区列表:

, REGIONS AS (
   SELECT DISTINCT REGION
   FROM DUDETAILSUMMARY
)
, DATES AS (
   SELECT DISTINCT SETTLEMENT_DATE
   FROM DISPATCH_UNIT_SCADA
   WHERE SCADA.SETTLEMENTDATE BETWEEN @OldestSettlementDate AND @NewestSettlementDate
)

现在在它们之间做一个交叉连接

, ALL_COMBOS AS (
   SELECT *
   FROM DATES, REGIONS, FUEL_TYPES
)

这会给你的行。现在,您可以将其加入当前的结果集以确保不会丢失任何结果,或者您可以使用它来加入基础表并提取数据。当然,还有很多优化空间,但这应该是一个有用的开始。

【讨论】:

  • 我接受了这个答案,因为它看起来正确。谢谢。虽然我没有测试它。我最终使用 C# LINQ 找到了一个非常相似的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-01
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多