2017-10-09 12 views
0

入力として月と年が使用された最後の12ヶ月の合計を返そうとしました。月と年の入力で過去12ヶ月を選択

私は入力に基づいて1年(1月から12月)を得ることができますが、私が入力した場合( '08'、 '2017')、08/2016-08の合計を計算します/ 2017。

私は別の入力を追加し、値をIN targetMonth intのように割り当てる必要があることは知っていますが、私はどのようにINTERVALに行くのかは分かりません。

'date_admitted'列の値は '2010-01-30'です。基本的に結果のテーブルには次のようになります。

Month Total % 
08 2016 10 16 
09 2016 10 16 
10 2016 10 16 
11 2016 10 16 
12 2016 10 16 
01 2017 10 16 
    etc etc etc 

相続人全体の年間

DROP PROCEDURE IF EXISTS YrReport; 
DELIMITER // 
CREATE PROCEDURE YrReport( 
IN targetYear int) 
BEGIN 
SELECT DATE_FORMAT(date_admitted, '%m') 
AS Month, 
COUNT(id) 
AS Total, 
ROUND(COUNT(id)/(SELECT COUNT(id) FROM 
accessions 
WHERE year(date_admitted) = targetYear)*100) 
AS '%' 
FROM accessions 
WHERE year(date_admitted) = targetYear 
GROUP BY DATE_FORMAT(date_admitted, '%Y%m'); 
END // 
DELIMITER ; 
+1

参照:[私は非常に単純なSQLクエリと思われるものに対してMCVEを提供するのはなぜですか?](https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an WHERE句にINTERVALステートメントを追加する方法は、 – Strawberry

+0

ですが、これは非常に単純なSQLクエリです。私はそれに行きましたが、私の入力が日付ではないので、仕事ができないと思っていましたか? – Blake

答えて

0

私はあなたが書いたコード全体に見ていないですが、あなたがあなたのWHERE条件を変えることによって、あなたの問題を解決することができるようです。ならば、あなたは

WHERE ((YEAR(date_admitted) = targetYear) AND 
     (MONTH(date_admitted) < targetMonth)) OR 
     ((YEAR(date_admitted) = (targetYear - 1)) AND 
     (MONTH(date_admitted) >= targetMonth)) 

によって

WHERE year(date_admitted) = targetYear 

を交換し、同様の方法で他のWHERE条件を変更することができ

.... 
IN targetMonth int) 

、私たちはあなたがあなたのストアドプロシージャの2番目のパラメータを持っているとしましょう必要。

あなたの例に戻って、これは08/2016(含む)から07/2017(含まれています)を12ヶ月に選択します。代わりに09/201608/2017を選択したい場合は、コードを変更することができます。

これは他のソリューションに比べてかなり速く動作すると思いますが、正確に1年を含める場合にのみ動作します。たとえば、そのコードに13か月間を簡単に組み込むことはできません。

+0

@Downvoterあなたはその答えに間違っていることを詳しく教えてください。 – Binarus

+0

感謝のヒープが私の問題を解決! – Blake

0

をcalcuatingための私のコードはここで何が必要です:

あなたは数字の年がある場合は、たとえば2016ため、このような式を使用して、そのcalendaryear内のdate_admittedのすべての行を取得できます。

WHERE date_admitted >= MAKEDATE(year, 1) 
    AND date_admitted < MAKEDATE(year, 1) + INTERVAL 1 YEAR 

あなたが一日のためにいくつかの日付スタンプを持っている、とあなたはその日(ない年初来の)前のデータの完全な12ヶ月を取得したい場合は、これを行います。

WHERE date_admitted >= LAST_DAY(datestamp) + INTERVAL 1 DAY - INTERVAL 13 MONTH 
    AND date_admitted < LAST_DAY(datestamp) + INTERVAL 1 DAY - INTERVAL 1 MONTH 

これは、現在の日付に特に便利です。

WHERE date_admitted >= LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 13 MONTH 
    AND date_admitted < LAST_DAY(CURDATE()) + INTERVAL 1 DAY - INTERVAL 1 MONTH 

あなたは月ごとにグループに必要がある場合は、MySQL date arithmeticの使用が少し冗長を得ることができます

SELECT SUM(something), COUNT(*), LAST_DAY(date_admitted) month_ending 
    FROM someTable 
    GROUP BY LAST_DAY(date_admitted) 

このような何かを。しかし、それは正確な日付フィルタリングとグループ化を行うことができます。

このイディオムはこれです。日付スタンプを含む月の最初の日は

LAST_DAY(datestamp) + INTERVAL 1 DAY - INTERVAL 1 MONTH 
関連する問題