2

昨年の2月と比較して、今年の2月に20%以上の売上を上げた部門番号を見つけるにはどうすればよいですか(今年のように、「2012」と言うのではなく、YEAR(CURDATE())を使用します)。 。結果テーブルには、売上が20%増加した部門番号を含む列が1つだけ含まれている必要があります。

昨年のfebrauryに「department2」の売上がなく、このfebrauryの売上がある場合、0 * 1.2 = 0であるため、結果には「department2」は表示されません。昨年の「department3」の2月が1アイテム、今年の2月が2アイテムを販売した場合、これは1.5の増加で1.2を超えるため、結果は「department3」と表示されます。部門が3つしかない場合、最大で3つの行しかないはずです。

昨年2月に3回の販売があり、この2月に1回の販売があったため、部門2は表示されません。昨年2月に販売がなかったため、部門4は表示されません。したがって、数学では0 * 1.2 = 0であるため、この2月に販売があったにもかかわらず、部門4は表示されません。

よろしくお願いします。これが十分に詳細であることを願っています。

4

2 に答える 2

1

これは、MAKEDATE()関数を使用して1年の最初の日を作成し、適切な月間隔を追加して、(2月)月の開始と翌月の開始日を計算します。

?1月の場合は1、2月の場合は2などに置き換えます。

SELECT 
    this_year.departement_no
FROM  
      ( SELECT departement_no, COUNT(*) AS num_sales
        FROM department
        WHERE date >= MAKEDATE( YEAR(NOW()), 1) + INTERVAL (?-1) MONTH
          AND date < MAKEDATE( YEAR(NOW()), 1) + INTERVAL (?) MONTH
        GROUP BY departement_no
      ) this_year
    LEFT JOIN
      ( SELECT departement_no, COUNT(*) AS num_sales
        FROM department
        WHERE date >= MAKEDATE( YEAR(NOW())-1, 1) + INTERVAL (?-1) MONTH
          AND date < MAKEDATE( YEAR(NOW())-1, 1) + INTERVAL (?) MONTH
        GROUP BY departement_no
      ) last_year
          ON  last_year.departement_no = this_year.departement_no
WHERE 
    this_year.num_sales > 1.2 * COALESCE(last_year.num_sales, 0) ;

(かなり奇妙な要件として)今年2月に売り上げがあり、昨年は売り上げがなかった部門を表示しないようにする場合は、COALESCE()関数を削除します。参加を変更してLEFT参加することもできますINNER

WHERE 
    this_year.num_sales > 1.2 * last_year.num_sales ;
于 2012-12-01T23:12:04.370 に答える
1

having以下のように使用してみてください。

    select departement_no
    from department
    group by departement_no
    having sum(case date_format(date, '%m%Y') 
                when CONCAT('02',YEAR(CURDATE())) then 1 else 0 end) 
           >
           1.2 * sum(case date_form(date, '%m%Y') 
                     when CONCAT('02',YEAR(DATE_SUB(CURDATE(),INTERVAL 1 Year)))
                     then 1 else 0 end)
         AND 
         sum(case date_form(date, '%m%Y') 
                     when CONCAT('02',YEAR(DATE_SUB(CURDATE(),INTERVAL 1 Year)))
                     then 1 else 0 end) > 0
于 2012-12-01T20:43:31.813 に答える