2017-07-17 18 views
1

私が望む答えに近づけるコードがあります。SQL - 条件付きの2つのテーブルの条件

今のところ、このコードでは、さまざまな見積もりの​​間に時間の間の増加が生じ、別の年にはnull以外の値が戻されます。しかし、私はそれを必要とするのは、基礎を成す企業がどちらの期間にも価値のある価値を合計することだけです。私はそこに推測している

Select m.date_Month 
    ,sum(case when y.date_year = 2016 then n.EBIT end)/sum(case when y.date_year = 2015 then n.EBIT end) - 1 as 'EBIT Growth 2015-2016' 
from EBIT as n 
    inner join date_year as y on y.date_year_id = n.date_year_id 
    inner join date_month as m on m.date_month_id = n.date_month_id 
where n.EBIT<> 0 and m.date_month > '2012-11-30' and m.date_month < '2017-01-31' 
group by m.date_month 
order by m.Date_Month asc; 

は、どちらかの合計で追加する必要がある何か(ケース....)構文またはwhere句です。

Iが望む正確に表示する短い例:

Company_Id Date_Year Date_Month Ebit 
1   2015  2014-12-30 50 
1   2016  2014-12-30 52 
2   2015  2014-12-30 60 
3   2015  2014-12-30 40 
3   2016  2014-12-30 43 

今のコードは、上の表を見てとる:(52 + 43)/(50 + 60 + 40)-1

私は取るそれを必要とする:従って、この特定Date_Monthための最終的な出力は、理想的であろう(52 + 43)/(50 + 40)-1

Date_Month EBIT Growth 2015-2016 
.....   ......  
2014-12-30 0.0556 
.....   ...... 

現在の出力(およびコードの望ましい出力は以下で見ることができますが、値には2015の値が含まれていて2016の値は含まれていないため、値は間違っています(またその逆もあります)。入力へ

date_Month 2014-2015 2015-2016 
2012-12-31 0.025866 NULL 
2013-01-31 0.043509 NULL 
2013-02-28 0.048632 NULL 
2013-03-31 1.120582 NULL 
2013-04-30 0.076691 NULL 
2013-05-31 0.072184 NULL 
2013-06-30 0.078506 NULL 
2013-07-31 0.088014 NULL 
2013-08-31 0.084344 NULL 
2013-09-30 0.088520 NULL 
2013-10-31 0.090181 NULL 
2013-11-30 0.091335 NULL 
2013-12-31 0.094102 0.989785 
2014-01-31 0.094030 0.011348 
2014-02-28 0.096986 0.024370 
2014-03-31 0.096916 0.040109 
2014-04-30 0.098773 0.044166 
2014-05-31 0.099726 0.051751 
2014-06-30 0.099677 0.063474 
2014-07-31 0.099865 0.071188 
2014-08-31 0.101077 0.073944 
2014-09-30 0.101028 0.075055 
2014-10-31 0.090556 0.079508 
2014-11-30 0.083493 0.083621 
2014-12-31 0.070896 0.088688 
2015-01-31 0.072573 0.095857 
2015-02-28 0.077159 0.102403 
2015-03-31 0.082023 0.102581 
2015-04-30 0.076842 0.096223 
2015-05-31 0.088918 0.094773 
2015-06-30 0.084905 0.093353 
2015-07-31 0.075418 0.086845 
2015-08-31 0.061566 0.085217 
2015-09-30 0.051807 0.071888 
2015-10-31 0.060045 0.066542 
2015-11-30 0.072266 0.061107 
2015-12-31 0.050182 0.055806 
2016-01-31 NULL   0.023453 
2016-02-29 NULL   0.029018 
2016-03-31 NULL   0.011684 
2016-04-30 NULL   0.007700 
2016-05-31 NULL   0.012831 
2016-06-30 NULL   0.001756 
2016-07-31 NULL   -0.001628 
2016-08-31 NULL   -0.001095 
2016-09-30 NULL   -0.000649 
2016-10-31 NULL   0.000707 
2016-11-30 NULL   0.015307 
2016-12-31 NULL   0.013374 

おかげで、これはほとんど私が欲しい、まさに生成コードですが、それは上の例で見られる「NULL」値が含まれていません。私は、Microsoftの管理を使用しています

SELECT 
    m1.date_Month, 
    SUM(n2.EBIT)/
    SUM(n1.EBIT) - 1 AS 'EBIT Growth 2014-2015', 
    SUM(n3.EBIT)/
    SUM(n2.EBIT) - 1 AS 'EBIT Growth 2015-2016' 
FROM EBIT AS n1 
    INNER JOIN date_year AS y1 ON y1.date_year_id = n1.date_year_id 
    INNER JOIN date_month AS m1 ON m1.date_month_id = n1.date_month_id 
INNER JOIN EBIT AS n2 
    INNER JOIN date_year AS y2 ON y2.date_year_id = n2.date_year_id 
    INNER JOIN date_month AS m2 ON m2.date_month_id = n2.date_month_id 
ON n1.Company_Id = n2.company_Id AND m1.date_month = m2.date_month 
INNER JOIN EBIT AS n3 
    INNER JOIN date_year AS y3 ON y3.date_year_id = n3.date_year_id 
    INNER JOIN date_month AS m3 ON m3.date_month_id = n3.date_month_id 
ON n2.Company_Id = n3.company_Id AND m2.date_month = m3.date_month 
WHERE n1.EBIT <> 0 AND n2.EBIT <> 0 and n3.EBIT <> 0 AND y1.date_year = 2014 AND y2.date_year = 2015 and y3.date_year = 2016 
GROUP BY m1.date_month 
ORDER BY m1.Date_Month ASC; 

をスタジオ。

+0

編集ご質問や、サンプルデータと望ましい結果を提供します。 –

+0

私はちょっと今編集しました。私の質問が何であるかを理解するためにもっと情報が必要な場合は教えてください –

答えて

1

あなたは、内側company_idは、両期間のいずれかに欠けている場合、行をフィルタする必要がありdate_monthcompany_idに基づいてのcriteriasを使用して、両方の期間(2016年と2015年)に参加するように照会書き直しを検討してください。あなたはcompany_idmonthごとに複数のレコードを持っているとき

SELECT 
    m1.date_Month, 
    SUM(n1.EBIT)/
    SUM(n2.EBIT) - 1 AS 'EBIT Growth 2015-2016' 

FROM EBIT AS n1 
    INNER JOIN date_year AS y1 ON y1.date_year_id = n1.date_year_id 
    INNER JOIN date_month AS m1 ON m1.date_month_id = n1.date_month_id 
INNER JOIN EBIT AS n2 
    INNER JOIN date_year AS y2 ON y2.date_year_id = n2.date_year_id 
    INNER JOIN date_month AS m2 ON m2.date_month_id = n2.date_month_id 
ON n1.Company_Id = n2.company_Id AND m1.date_month = m2.date_month 

WHERE n1.EBIT <> 0 AND n2.EBIT <> 0 AND y1.date_year = 2016 AND y2.date_year = 2015 

GROUP BY m1.date_month 
ORDER BY m1.Date_Month ASC; 

の問題は、このソリューションで生じるであろう。あなたがNULL値を含める必要がある場合


、ちょうどLEFT JOINの代わりINNER JOIN使用。その場合、x/NULLまたはNULL/xは両方ともNULLに等しいので、SUM関数はNULL値を無視し、すべての合計値がNULLの場合にのみNULLに等しいため、指定した会社の次の年に一致するレコードがない場所でNULL値を取得します。そのため、その後の年に関連する値がなくても、結果セットに含まれるすべてのレコードが基準年に含まれます。

... 
LEFT JOIN EBIT AS n2 
... 
LEFT JOIN EBIT AS n3 
... 

また、最初あなたがそれを必要とする場合、INNERおよび第二LEFTに参加し、そして最後に、関連する年(2016年)の形参加を開始することができます。その場合、関連するコンパイル2016-2015とコンパイル2015-2014のみが表示され、そのうちのいくつかはnullになります。

このような何か:

SELECT 
    m1.date_Month, 
    SUM(n1.EBIT)/
    SUM(n2.EBIT) - 1 AS 'EBIT Growth 2016-2015', 
    SUM(n2.EBIT)/
    SUM(n3.EBIT) - 1 AS 'EBIT Growth 2015-2014' 
FROM EBIT AS n1 
    INNER JOIN date_year AS y1 ON y1.date_year_id = n1.date_year_id 
    INNER JOIN date_month AS m1 ON m1.date_month_id = n1.date_month_id 
INNER JOIN EBIT AS n2 
    INNER JOIN date_year AS y2 ON y2.date_year_id = n2.date_year_id 
    INNER JOIN date_month AS m2 ON m2.date_month_id = n2.date_month_id 
ON n1.Company_Id = n2.company_Id AND m1.date_month = m2.date_month 
LEFT JOIN EBIT AS n3 
    INNER JOIN date_year AS y3 ON y3.date_year_id = n3.date_year_id 
    INNER JOIN date_month AS m3 ON m3.date_month_id = n3.date_month_id 
ON n2.Company_Id = n3.company_Id AND m2.date_month = m3.date_month 
           AND y3.date_year = 2014 
WHERE y1.date_year = 2016 AND y2.date_year = 2015 
GROUP BY m1.date_month 
ORDER BY m1.Date_Month ASC; 
+0

ありがとうございます。これは私が1列にしたいものですが、私が持っていると思う 'Null'の値を得ることができないので、私はすべての列がデータを持っている時系列を取得します。 1つの時系列(2015-2016)に対して同じ制約を維持し、別の時系列がNULL値などを持つようにする方法があるかどうかを知っていますか(2014-2015年末および2015-2016年)私たちは2014年から2015年の初めより多くの価値を持ち、2015年から2016年にかけてより多くの価値を持っていますから) –

+0

@CedricVongheer編集を確認してください... –

+0

悲しいことに、コードは私に 'Null'値を与えません(また、内部結合のすべてを左結合(またはその一部のみ)に変更することもありません)。私のシステムではちょっと奇妙なことが起こりそうですが、左の結合がうまくいくはずです。 しかし、このクエリでは、使用されたデータが異なる期間に存在することを確認しないと、私はそれを使用できません。最適なのは、別の同じコードを別のピリオドにまとめて左の結合を作成する方法があれば、おそらく代わりにビューを組み込むことでしょうか? ありがとうございました! –