環境
選択した日付範囲で累積計算を実行したいと思います。(つまり、2014-07-01(以降、簡単にするために01と呼びます)は01のデータのみで計算を実行します。02は01と02のデータを使用して計算を実行します。03は01、02、および03のデータを使用します。など。)
詳細
私は店で行われたすべての販売と苦情があったかどうかの記録を持っています。以下のクエリを使用して次のテーブルを生成するのは簡単です-
SELECT
Date,
COUNT(*) AS Sales,
SUM(CASE WHEN ComplaintMade = 'True' THEN 1 ELSE 0 END) AS Complaints
FROM SalesRecords
WHERE Date BETWEEN '2014-07-01' AND '2014-07-05'
GROUP BY Date
ORDER BY Date
--------------------------------------
| Date | Sales | Complaints |
--------------------------------------
| 2014-07-01 | 100 | 2 |
| 2014-07-02 | 150 | 6 |
| 2014-07-03 | 180 | 9 |
| 2014-07-04 | 140 | 10 |
| 2014-07-05 | 300 | 15 |
--------------------------------------
苦情ごとの平均売上高の計算は、このクエリを拡張して次を選択することで簡単に計算できます-
COUNT(*)
/
CASE WHEN(SUM(CASE WHEN ComplaintMade = 'True' THEN 1 ELSE 0 END)) = 0
THEN 1
ELSE (SUM(CASE WHEN ComplaintMade = 'True' THEN 1 ELSE 0 END))
END)
AS SalesPerComplaint
(これは、行われた苦情ごとの売上数(売上/苦情)、または苦情がない場合は売上数(売上/ 1)を示します)
これにより、次の表が表示されます。
----------------------------------------------------------
| Date | Sales | Complaints | SalesPerComplaint |
---------------------------------------------------------|
| 2014-07-01 | 100 | 2 | 50 |
| 2014-07-02 | 150 | 6 | 25 |
| 2014-07-03 | 180 | 9 | 20 |
| 2014-07-04 | 140 | 10 | 14 |
| 2014-07-05 | 300 | 15 | 20 |
---------------------------------------------------------|
私がやりたいのは、累積SalesPerComplaintを表示することです。したがって、2014-07-01の場合、2014-07-01の売上高を2014-07-01の苦情の数で割った値を取ります。ただし、2014-07-02の場合は、01と02の売上を、01と02の苦情で割った値を取ります。また、03の場合は、 01、02、03のデータを使用します。
したがって、テーブルの最初の数行は次のようになります-
--------------------------------------------------------------------
| Date | Sales | Complaints | CumulativeSalesPerComplaint |
-------------------------------------------------------------------|
| 2014-07-01 | 100 | 2 | 50 |
| 2014-07-02 | 150 | 6 | 31.25 |
-------------------------------------------------------------------|
(2014-07-02のCumulativeSalesPerComplaintは、これまでの両方の日付からの売上(100 + 150 = 250)をこれまでの両方の日付からの苦情の数(2 + 6 = 8)で割って計算されるため、31.25になりました( 250/8 = 31.25))
(この質問の書式を改善できるかどうか教えてください。できるだけ明確にしたかったのですが、詳細が多すぎたり、構造がわかりにくい場合は、お知らせください。喜んで改善します。ありがとうございます。)
私のsqlfiddleはsqlfiddle.com/#!2/9e2ad/5にあります
これはどうですか(SqlFiddle)?
このクエリでは、所有している個別の日付を、すでに取得したデータと結合しています。
SELECT sr.uniqueday Date, qry.Sales, qry.Complaints,
SUM(Sales)/SUM(Complaints) CumulativeSalesPerComplaint
FROM (SELECT DISTINCT(Date) uniqueday FROM SalesRecords) sr
LEFT JOIN (
SELECT
Date,
COUNT(*) AS Sales,
SUM(CASE WHEN ComplaintMade = 'True' THEN 1 ELSE 0 END) AS Complaints,
((COUNT(*)) / (CASE WHEN (SUM( CASE WHEN ComplaintMade = 'True' THEN 1 ELSE 0 END )) = 0
THEN 1
ELSE (SUM( CASE WHEN ComplaintMade = 'True' THEN 1 ELSE 0 END ))
END)
) AS SalesPerComplaint
FROM SalesRecords
WHERE Date BETWEEN '2014-07-01' AND '2014-07-05'
GROUP BY Date
ORDER BY Date DESC
) qry ON qry.Date <= sr.uniqueday
GROUP BY sr.uniqueday
秘訣は、2つのテーブル(1つは数日のみを含み、もう1つはデータを含む)を条件 "qry.Date <= sr.uniqueday"の結合で結合することです。したがって、単一の一意の日付に対して、以前のすべてを結合します。行。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加