1

ここで少し問題が発生しました。私は私の人生ではできません。これを行う方法を見つけてください。

pid | firstlast | lastvisit | zip 
---------------------------------------
435 | 2001-01-17 | 2012-01-21 | 46530
567 | 2001-01-18 | 2012-01-21 | 46530
532 | 2001-01-19 | 2012-01-22 | 46535
536 | 2001-01-19 | 2012-01-23 | 46535
539 | 2001-01-20 | 2012-01-27 | 46521

これが私のSQLクエリです:

SELECT DISTINCT zip, COUNT(zip) AS totalzip FROM production WHERE MONTH(lastvisit) = "1" GROUP BY zip ORDER BY totalzip DESC;

出力:

ヤン:

zip | totalzip
--------------------- 
46530 | 2
46535 | 2
46521 | 1

2月:

zip | totalzip
--------------------- 
46530 | 1
46521 | 4
49112 | 3

これは最初の 1 か月には最適ですが、1 年間はこれが必要です。このクエリを 12 回実行できましたが、2 つの問題が発生しました。1 年で 300 以上の郵便番号があります。一部の月には郵便番号が存在しないため、カウントは 0 です (ただし、MySQL の出力は「ゼロ データ」を出力しません。また、totalzip で注文すると、注文は月ごとに変わりますが、これはそうではありません。スプレッドシートに貼り付けさせてください. 郵便番号で注文できますが、「ゼロ」データの郵便番号が存在しないため、リストは月ごとに変わります.

どんな考えや提案も大歓迎です!

4

3 に答える 3

1

サブクエリでこれを機能させることができます:

select 
    a.*, count(c.zip) as totalZip
from
   (select 
       monthVisit, zip
    from
        (select distinct last_day(lastVisit) as monthVisit from production) as m,
        (select distinct zip from production) as z
   ) as a
   left join (select 
                  last_day(lastVisit) as monthVisit, zip
              from production) as c
       on a.monthVisit=c.monthVisit and a.zip=c.zip
 group by
     a.monthVisit, a.zip

これにより、ゼロを含む各月の zip の数が得られます。

これがどのように機能するかを説明しましょう:

最初に、 zip と月のすべての可能な組み合わせを作成するサブクエリ (サブクエリ) を定義しa、これを ZIP と月の値を返す 2 番目のサブクエリ (サブクエリ) に結合したままにしましたc。を使用すると、サブクエリleft joinで可能な空の組み合わせをカウントできます。a

これがお役に立てば幸いです。

注: このlast_day()関数は、指定された日付の月の最後の日を返します。例えば:last_day('2012-07-17')='2012-07-31'

于 2012-07-17T18:07:24.973 に答える
0

郵便番号テーブルがある場合 (そうするべきです)、それをデータ テーブルと結合 (左結合) することができます。

于 2012-07-17T17:30:36.223 に答える
0

質問の最初の部分は、追加のグループ化で解決されます。次のようなことを試してください:

 SELECT DISTINCT zip, YEAR(lastvisit),  MONTH(lastvisit), COUNT(zip) AS totalzip 
 FROM production 
 GROUP BY  zip, YEAR(lastvisit),  MONTH(lastvisit)
 ORDER BY totalzip DESC; 

データが存在しないときに「ゼロ」の要約を追加するには、通常、完全なリストで左結合を行います。(これは、上記の@Alfabravoによっても述べられています)。したがって、最終的なクエリは次のようになります。

 SELECT DISTINCT zip, YEAR(lastvisit),  MONTH(lastvisit), COUNT(zip) AS totalzip 
 FROM production left join 
      (SELECT DISTINCT zip from production) as zipMap on zipmap.zip = production.zip
 GROUP BY  zip, YEAR(lastvisit),  MONTH(lastvisit)
 ORDER BY totalzip DESC; 
于 2012-07-17T17:54:09.957 に答える