0

mysql クエリに問題があり、誰かが助けてくれることを願っています。

次のテーブルがあります。

CREATE TABLE USER
(
ID VARCHAR(80) NOT NULL, 
REGISTRATION_DATE DATE NOT NULL,
..... 
PRIMARY KEY(ID)
);

CREATE TABLE INVOICES
(
USER_ID VARCHAR(80) NOT NULL,
INVOICE_NUMBER VARCHAR(50) NOT NULL,
CREATION_DATE DATE NOT NULL,
........
PRIMARY KEY(USER_ID, INVOICE_NUMBER),
FOREIGN KEY(USER_ID) REFERENCES USER(ID)
);

次の機能が必要です: クエリのパラメーターとして開始日と終了日 (期間) (例: 01.02.2013-31.05.2013) を選択し、表示したい:

  1. 選択した期間の各月の合計ユーザー数 (! は、1 か月あたりのユーザー数ではなく、その月まで (およびその月を含む) の合計ユーザー数)。
  2. この月に少なくとも 1 つの請求書を作成したユーザーの数 (これも毎月)。
  3. 各月の請求書の数 (ここでは 1 か月あたりの数)。

例: 期間: 01.02.2013-31.05.2013 結果セット:

Month | Year | Total count of users | Count of users who created at least one invoice in this month | Count of invoices in this month
Febr  |  2013  |  20  |  12  |  45
March |  2013  |  20  |  4   |  22
April |  2013  |  23  |  20  |  30
May   |  2013  |  28  |  27  |  69

そのようなクエリを書くことは可能ですか? 私はこれを試しました:

SELECT YEAR, MONTH, @VAR := @VAR + TOTS.COUNT AS USERS_TOTAL
FROM (
    SELECT
        YEAR(REGISTRATION_DATE) AS YEAR,
        MONTH(REGISTRATION_DATE) AS MONTH,
        COUNT(ID) AS COUNT
    FROM USER
WHERE REGISTRATION_DATE <= '2013-05-31'
    GROUP BY YEAR, MONTH
) AS TOTS, (SELECT @VAR := 0) AS INC

ユーザーの総数を取得しますが、新しい登録ユーザーがいる場合のみです。つまり、Ferb のユーザーの総数です。3 月は 20 日、4 月 21 日は 2 月です。- 20、3 月と 4 月の情報はありません 21、選択した期間から各月の情報が必要です。

このクエリを使用すると、少なくとも 1 つの請求書を作成したユーザーの数を取得できますが、その数が前月の数と同じである場合、情報はありません。

SELECT YEAR(CREATION_DATE) as YEAR, MONTH(CREATION_DATE) as MONTH,
 COUNT(DISTINCT CUSTOMER_ID) 
FROM INVOICES
WHERE CREATION_DATE >= '2013-02-01' AND CREATION_DATE <='2013-05-31'
GROUP BY YEAR, MONTH

このクエリを使用すると、選択した期間の各月の請求書の数を取得できます。

SELECT YEAR(CREATION_DATE) as YEAR, MONTH(CREATION_DATE) as MONTH, COUNT(INVOICE_NUMBER) 
FROM INVOICES
WHERE CREATION_DATE >= '2013-02-01' AND CREATION_DATE <='2013-05-31'
GROUP BY YEAR, MONTH

これを単一のクエリで機能させたいのですが、前述のように、情報が前月と同じであっても、毎月の情報を取得したいと考えています。どうすれば私が望む結果を達成できますか、何かアイデアはありますか?

4

1 に答える 1

0

それぞれを個別に生成するのは非常に簡単です。しかし、それらを単一のクエリに入れたい場合、これは面倒です。別々の手順で実行する方がよい場合があります。しかし、ここに私の試みがあります

SELECT 
       extract(MONTH FROM i.date) AS MONTH, 
       extract(YEAR FROM i.date) AS YEAR, count(i.*) AS Count_Invoices, 
       count(user.*) as count_users, 
      CASE (WHERE i.* IS NOT NULL COUNT u.id END) AS active_users_this_month

FROM 
      invoices I RIGHT JOIN users u

GROUP BY 
      Year, Month
于 2013-05-29T14:43:46.500 に答える