2

2 つの DATE 列を含むテーブルがあります。TS_customer および TS_verified

最初の列に、誰かがユーザーを作成した日付 (TS_customer) または誰かが検証された日付 (TS_verified) がある結果を取得する方法を探しています。

2 番目の列では、最初の列でグループ化された count(TS_customer) が必要です。count(TS_verified) が必要な 3 番目の列は、最初の列でグループ化されます。

サインアップ日に確認された顧客が 0 人の場合もあれば、誰かが確認された日に 0 人のサインアップがあった場合もあります。

簡単なことだと思いますが、今では非常に多くの時間を費やしてきました。助けていただければ幸いです。これは Excel のグラフに必要なので、基本的には、サインアップした顧客の数と、2 つの選択を手動で結合する手間をかけずに、1 日で確認された数が必要です。

編集: SQLfiddle へのリンクhttp://sqlfiddle.com/#!2/b14fc/1/0

ありがとう

4

2 に答える 2

4

まず、日のリストが必要です。

http://sqlfiddle.com/#!2/b14fc/14/0のようになります。

   SELECT DISTINCT days
     FROM (
       SELECT DISTINCT DATE(TS_customer) days
         FROM customer
        UNION 
       SELECT DISTINCT DATE(TS_verified) days
         FROM customer

     ) AS alldays
 WHERE days IS NOT NULL
 ORDER BY days

次に、日ごとの顧客数の概要が必要です。それはとても簡単ですhttp://sqlfiddle.com/#!2/b14fc/16/0 :

SELECT DATE(TS_customer) days, COUNT(TS_customer)
  FROM customer
 GROUP BY days

日ごとの検証の要約も同様に簡単です。

次に、これら 3 つのサブクエリを結合する必要があります http://sqlfiddle.com/#!2/b14fc/29/0

SELECT alldays.days, custcount, verifycount
  FROM (
           SELECT DISTINCT DATE(TS_customer) days
             FROM customer
            UNION 
           SELECT DISTINCT DATE(TS_verified) days
             FROM customer
       ) AS alldays
   LEFT JOIN (
      SELECT DATE(TS_customer) days, COUNT(TS_customer) custcount
        FROM customer
       GROUP BY days
      ) AS cust ON alldays.days = cust.days
   LEFT JOIN (
      SELECT DATE(TS_verified) days, COUNT(TS_verified) verifycount
        FROM customer
       GROUP BY days
      ) AS verif ON alldays.days = verif.days
  WHERE alldays.days IS NOT NULL
  ORDER BY alldays.days

最後に、顧客や検証がない日0ではなく表示する場合は、SELECT 行をhttp://sqlfiddle.com/#!2/b14fc/30/0に変更します。(null)

SELECT alldays.days, 
       IFNULL(custcount,0) AS custcount, 
       IFNULL(verifycount,0) AS verifycount

それがどうなるか見てください?結果セットを段階的に構築します。

于 2013-10-27T01:36:31.590 に答える
0

nullTS_Customer で値を保持できないフィドルを作成し、フィールドがnull値を保持できると述べた理由について少し混乱しています。

そうは言っても、私はソリューションを変更してnull値を操作し、それでも非常に効率的でシンプルにしました。

SELECT days, sum(custCount) custCount, sum(verifCount) verifCount FROM (
  SELECT DATE(TS_customer) days, count(*) custCount, 0 verifCount
  FROM customer
  WHERE TS_customer IS NOT NULL
  GROUP BY days
  UNION ALL
  SELECT DATE(TS_verified) days, 0, count(*)
  FROM customer
  WHERE TS_verified IS NOT NULL
  GROUP BY days
) s
GROUP BY days

また、いくつかの null 値を含む別のフィドルを作成しましたhere

于 2013-10-27T02:23:14.330 に答える