2014-01-24 2 views
1

У меня есть SQL-запрос, который я пытаюсь изменить, но я боюсь, что мой SQL-foo недостаточно хорош, чтобы понять это.Как присоединиться к отдельному второму запросу в SQL Server

Итак, у меня есть следующий запрос ..

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 

Проблема заключается в том, я хочу, чтобы все виды топлива появляться для каждого дату расчета и регион. Например, бурый уголь должен показать на 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 

Спасибо.

+1

весьма неудачная конкатентация: "DUDETAILSUMMARY" –

+0

lol. да, это не наша схема базы данных. Мы просто должны использовать его в нашем программном обеспечении. – craftworkgames

ответ

0

Start со списком видов топлива:

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 
) 

Этот дает ваши строки. Теперь вы можете присоединиться к этому вашему текущему набору результатов, чтобы убедиться, что вы его не теряете, или можете использовать его для соединения с базовыми таблицами и вытаскивания данных. Разумеется, много места для оптимизации, но это должно быть полезным началом.

+0

Я принял этот ответ, потому что он выглядит правильно. Благодарю. Я не тестировал его. Я закончил с очень похожим решением, используя C# LINQ. – craftworkgames

Смежные вопросы