2016-03-26 4 views
0
select datepart(year, data) Year, DATEPART(month, data) Month, 
     Coalesce(sum(number),0) as sum 
from drugsEdition inner join 
    visit 
    on drugsEdition.idVisit = visit.id inner join 
    drugsSeries 
    on drugsEdition.idDrugSeries = drugsSeries.id inner join 
    drugs 
    on drugsSeries.idDrugs = drugs.id 
where idDrugs = 153 or idDrugs = 1241 
group by DATEPART(year, data), DATEPART(month, data) 
order by Year, Month 

こんにちは、SQLがどのように私は句に参加

に0を返すことができます私は私がこのような場合には0を返すことができるか、という問題があります。私は、各月に使用される薬物の合計数を返すようにしたいが、このコードは数ヶ月を返さない結果と0例:

Year Month sum 
2014 3 3,9 
2014 4 2,8 
2014 5 0,7 
2014 8 2,6 
2014 9 0,5 
2014 10 2,4 

月7ここで

+0

番号使用時ISNULL(数値、0)...合体(合計(ISNULL(数字、0))、0) – Veljko89

+0

それは動作していません –

+2

外部結合が必要です –

答えて

1

ない二つの基本的なアプローチがあります。これに。 1つは有効な月のリストを使用し、次にすべてを含めるにはleft joinです。より一般的な目的の方法です - 何とかあなたは月のリストを生成する必要があります。

しかし、あなたのケースでは、毎月のテーブルにレコードがある可能性はありますが、それはwhere句で除外されます。そう、あなたが条件付きの集約を使用することができた場合:

select datepart(year, data) as yyyy, DATEPART(month, data) as mon, 
     sum(case when idDrugs in (153, 1241) then number else 0 end) as Total 
from drugsEdition inner join 
    visit 
    on drugsEdition.idVisit = visit.id inner join 
    drugsSeries 
    on drugsEdition.idDrugSeries = drugsSeries.id inner join 
    drugs 
    on drugsSeries.idDrugs = drugs.id 
group by DATEPART(year, data), DATEPART(month, data) 
order by yyyy, mon; 

なお、列名は、yearmonth、およびsumとして悪い選択です。これらはSQLキーワードまたは関数名です。言語で予約されている名前のほんの一握りをはっきりさせるのがよいでしょう。

+0

ええ、あなたは言及しました。それは単に安全です。なぜなら、1ヶ月に何もエントリーがないかどうかは、どうやって知ることができるからですか。 –