0

私が使用するテーブルの例は次のとおりです。

    id_user  | process_number |    date   
  ---------------------------------------
      01     |        1       | 2012-05-04
      01     |        1       | 2012-05-04
      02     |        0       | 2012-05-04
      01     |        1       | 2012-05-05
      01     |        2       | 2012-05-05
      01     |        0       | 2012-05-05
      02     |        0       | 2012-05-05
      03     |        1       | 2012-05-05
      04     |        2       | 2012-05-05
      05     |        1       | 2012-05-05
      05     |        1       | 2012-05-05
      06     |        0       | 2012-05-05
      07     |        3       | 2012-05-05

私が取得したい結果は、一意のプロセスの数 (id_user でグループ化)、合計プロセスの数 (日付でグループ化)、および process_number が「0」に等しくない場合 (日付とユーザーでグループ化) の個別のユーザー数です。私はクエリでこれを達成しようとしました:

SELECT COUNT( DISTINCT id_user ) AS user_process, COUNT( * ) AS total_process, DATE( date) AS date_process, SUM( IF( process_number = '0', 0, 1 ) ) notification FROM a_proces GROUP BY DATE( date ) ORDER BY DATE( date ) DESC LIMIT 0 , 10

このクエリは、特定の日に、通知列にゼロより大きい複数の process_number を持つすべてのユーザーを追加します。この例の正しい結果は次のようになります。

 date_process    |       user_process       |        total_process     |  notification
 ------------------------------------------------------------------------------
   2012-05-04    |            2             |              3           |       1
   2012-05-05    |            7             |              10          |       6

助けてくれてありがとう。

4

1 に答える 1

0

以下を使用できるはずです。

SELECT DATE_FORMAT( date, '%d/%m/%Y' ) AS date_process,
  COUNT(DISTINCT id_user) AS user_process, 
  COUNT( * ) AS total_process, 
  count(distinct case when process_number <> 0 then id_user end) notification 
FROM a_proces 
GROUP BY DATE( date ) 
ORDER BY DATE( date ) DESC 
LIMIT 0 , 10;

デモで SQL Fiddle を参照してください

process_number必要な通知結果が、各の個別の合計数である場合はid_user、次を使用できます。

SELECT DATE_FORMAT( p.date, '%d/%m/%Y' ) AS date_process,
  COUNT(DISTINCT p.id_user) AS user_process, 
  COUNT( * ) AS total_process, 
  d.notification 
FROM a_proces p
INNER JOIN
(
  select count(process_number) notification, date
  from
  (
    select distinct id_user, process_number,
      DATE_FORMAT( date, '%d/%m/%Y' ) date
    from a_proces
    where process_number <> 0
  ) d
  group by date
) d
  on DATE_FORMAT( p.date, '%d/%m/%Y' )  = d.date
GROUP BY DATE( p.date ), d.notification
ORDER BY DATE( p.date ) DESC 
LIMIT 0 , 10;

デモで SQL Fiddle を参照してください

于 2013-05-29T18:30:10.690 に答える