0

私はこれを試します:

SELECT
  profile.user_id,
  profile.name,
  total_month.total as month10
FROM profile
  LEFT OUTER JOIN (SELECT
      order.seller_id,
      COUNT(*) AS total
    FROM order
    WHERE MONTH(order.data_hora) = 10
    GROUP BY order.seller_id) AS total_month
    ON total_month.seller_id= profile.user_id;

結果は次のとおりです。

-------------------------
|user_id| name  |month10|
-------------------------
|   5   |user1  |  73   |
|   1   |user2  |   1   |
-------------------------

しかし、次のような月がもっと必要です。

-------------------------------------------------
| user_id | name  | month10 | month11 | month12 |
-------------------------------------------------
|    5    | user1 |   73    |    52   |    65   |
|    1    | user2 |   67    |    56   |    78   |
-------------------------------------------------

関数を作成せずにこれを行うにはどうすればよいですか?

4

3 に答える 3

0

@Schalk コメントをサポートするコメントで述べたように、これを希望どおりに機能させるには、必要に応じて取得するDYNAMIC PIVOT TABLEか、TRANSPOSE ROWS TO COLUMNSGoogle で検索する関数が必要です。

あなたのソリューションのために、次のようなすべての月/値を提供するクエリを作成しました。

user_id  name  jan feb mar  apr  may jun jul aug sep oct nov dec
   1       a    0   0   1   10    0   0   1   2   7   2   3   0 
   2       b    1   0   0    0    2   0   0   0   3   1   1   0 

それがあなたの問題に当てはまる場合、これはあなたのクエリです:

select
    profile.user_id,
    profile.name,
    sum(if( MONTH(orderr.data_hora) = 1, 1, 0 )) as Jan,
    sum(if( MONTH(orderr.data_hora) = 2, 1, 0 )) as Feb,
    sum(if( MONTH(orderr.data_hora) = 3, 1, 0 )) as Mar,
    sum(if( MONTH(orderr.data_hora) = 4, 1, 0 )) as Apr,
    sum(if( MONTH(orderr.data_hora) = 5, 1, 0 )) as May,
    sum(if( MONTH(orderr.data_hora) = 6, 1, 0 )) as Jun,
    sum(if( MONTH(orderr.data_hora) = 7, 1, 0 )) as Jul,
    sum(if( MONTH(orderr.data_hora) = 8, 1, 0 )) as Aug,
    sum(if( MONTH(orderr.data_hora) = 9, 1, 0 )) as Sep,
    sum(if( MONTH(orderr.data_hora) = 10, 1, 0 )) as Oct,
    sum(if( MONTH(orderr.data_hora) = 11, 1, 0 )) as Nov,
    sum(if( MONTH(orderr.data_hora) = 12, 1, 0 )) as Dece
from 
    profile left join orderr 
                   on profile.user_id = orderr.seller_id
group by profile.user_id,
         profile.name

私はそれにフィドルを作成しました(ただし、data_horaそれをすばやく行うために整数として作成した列は、理解するためのものです)。

http://sqlfiddle.com/#!2/4a1a2e/5

于 2013-11-01T16:44:14.757 に答える
0

完璧でした!

フィールドタイプ「data_hora」はdatetimeなので、少し変更しました。

SELECT p.user_id,
       p.name,
       tm.month10,
       tm.month11,
       tm.month12,
       (tm.month10+tm.month11+tm.month12) AS final_total
FROM profile p
LEFT OUTER JOIN
  (SELECT o.seller_id,
          sum(month(o.data_hora) = 10) AS month10,
          sum(month(o.data_hora) = 11) AS month11,
          sum(month(o.data_hora) = 12) AS month12
   FROM order o
   WHERE MONTH(ORDER.data_hora) IN (10, 11, 12)
   GROUP BY ORDER.seller_id ) tm 
   ON tm.seller_id = p.user_id
ORDER BY final_total DESC;

フィールド「final_total」を最適化するにはどうすればよいですか?

于 2013-11-01T16:55:44.430 に答える