0

こんにちは、このクエリを実行して、いくつかのデータベース情報の統計があるテーブルを取得します..存在しないフィールドを初期化したいと思います (クエリは異なる日付で実行され、何もない日があるため)だから私はそれが0とNULLを返すようにしたい(TOP列に)


SELECT
  SUM(IF(`TOP` = 'one',`Nb`,0)) as first_one,
  SUM(IF(`TOP` = 'two',`Nb`,0)) as second_one,
  SUM(IF(`TOP` = 'three',`Nb`,0)) as thrid_one,
  SUM(IF(`TOP` NOT IN ('three','two','one'),`Nb`,0)) as forth_one,
  GROUP_CONCAT(IF(`TOP` NOT IN ('three','two','one'),`TOP`,'') SEPARATOR '') as `OR`
FROM (
    SELECT 
        COUNT(*) as Nb,
        'one' as `TOP` 
    FROM 
        mytable 
    WHERE 
        TYPE = 'MSS' 
        AND YEAR(date) = YEAR(CURDATE()) 
        AND MONTH(date) = MONTH(CURDATE()) 
    UNION ALL
    SELECT 
        COUNT(*) as Nb,
        'two' as `TOP` 
    FROM 
        mytable 
    WHERE 
        TYPE = 'MSS' 
        AND S=0
        AND YEAR(date) = YEAR(CURDATE()) 
        AND MONTH(date) = MONTH(CURDATE()) 
    UNION ALL
    SELECT 
        COUNT(*) as Nb,
        'three' as `TOP` 
    FROM 
        mytable 
    WHERE 
        TYPE = 'MSS' 
        AND S<>0
        AND YEAR(date) = YEAR(CURDATE()) 
        AND MONTH(date) = MONTH(CURDATE()) 
    UNION ALL
    SELECT
      `Nb`,
      `TOP`
    FROM(
      SELECT 
        COUNT(*) as Nb ,
        `OR` as `TOP` 
      FROM 
        mytable 
      WHERE 
        TYPE = 'MSS'  
        AND YEAR(date) = YEAR(CURDATE()) 
        AND MONTH(date) = MONTH(CURDATE()) 
      GROUP BY 
        `OR` 
      ORDER BY 
         Nb DESC 
      LIMIT 1
    ) as tmp
)as tmp1
4

3 に答える 3

0

SQL は、既存のエンティティをカテゴリにグループ化するのは得意ですが、エンティティ自体を「作成」するのは苦手です。日付以外のカテゴリもある場合は、一般的な数値表(実際には0から数十万までの数値)をお勧めします。または、Wiktorが提案したように、時々満たされ、次の数年を持つ日付表を提案しますプログラムが動作してからの時間。

日付表あり

list_dates (
     id int(11) not null primary key auto_increment, 
     dateval date not null
)

そのテーブルからクエリを開始し(もちろん、妥当な範囲で)、他のすべてをカウントできます。

select list_dates.dateval as date, count(*) as cnt
from list_dates
left join actions on actions.actiontime >= (cast list_dates.date_val as datetime) 
     and actions.actiontime < (cast list_dates.date_val `interval 1 day as datetime) 
where list_dates.dateval between '$fromDate' and '$toDate'
group by list_dates.dateval
;

またはナンバーテーブル番号で始まる

select $fromDate + interval numbers.number day as date, count(*) as cnt
from numbers
left join actions 
on actions.actiontime >= (cast $fromDate + interval numbers.number day  as datetime) 
   and actions.actiontime < (cast $fromDate + interval (1 + numbers.number) day as datetime) 
where numbers.number >= 0 and numbers.number < $countDates
group by numbers.number
;

ある日

その 1 日 (今日) だけが本当に必要な場合は、もちろん、代わりに匿名の subselect-Table を使用できるため、次のようになります。

select list_dates.dateval as date, count(*) as cnt
from ( select curdate() as dateval ) as list_dates
left join actions on actions.actiontime >= (cast list_dates.date_val as datetime) 
     and actions.actiontime < (cast list_dates.date_val `interval 1 day as datetime) 
where list_dates.dateval between '$fromDate' and '$toDate'
group by list_dates.dateval
;
于 2013-05-27T14:29:49.967 に答える