SQLで日付範囲にわたって累積計算を実行するにはどうすればよいですか?(たとえば、01の計算では01のデータが使用され、02では01と02が使用されます)。

ヘレン

環境

選択した日付範囲で累積計算を実行したいと思います。(つまり、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の場合は、0102の売上を、0102の苦情で割った値を取ります。また、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にあります

lpg

これはどうですか(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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ