テーブルを自分自身と比較するような抽出処理を行なう場合,相関サブクエリを使えば実現できます。
※今日のデータと昨日のデータで同一のテーブルを比較対象にしている
SELECT 名簿1.name, 売上1.date, 売上1.sales FROM 当日売上テーブル AS 売上1 LEFT JOIN 社員名簿テーブル AS 名簿1 ON 売上1.item_id = 名簿1.item_id WHERE -- 日付が1日違いで,なおかつ金額が1000円以上異なっているレコードを抽出 EXISTS ( SELECT * FROM 当日売上テーブル AS 売上2 LEFT JOIN 社員名簿テーブル AS 名簿2 ON 売上2.item_id = 名簿2.item_id WHERE -- 日付が1日違いであること ( ABS( DATEDIFF( 売上1.date, 売上2.date ) ) = 1) AND -- 今日か昨日のレコードであること ( 売上1.date = CURDATE() OR 売上2.date = CURDATE()) AND -- 金額が1000円以上異なっていること ( ABS(売上1.sales - 売上2.sales) >= 1000 ) ) ORDER BY 社員名簿テーブル.name ASC, 当日売上テーブル.date ASC ;
自信が無いのでコメントに書いたのですが、あまりにも見にくかったので、回答で失礼します。
手元にMySQLの環境がないのでテストできないのですが、大体こんな感じでしょうか
SELECT e.name, SUM(a.sales) FROM 社員名簿テーブル AS e WHERE e.item_id IN ( SELECT a.item_id FROM FROM 当日売り上げテーブル AS a WHERE a.date = CURDATE() HAVING SUM(a.sales) >= ANY ( SELECT SUM(b.sales) + 1000 FROM 当日売り上げテーブル AS b WHERE ( a.item_id = b.item_id ) HAVING ( b.date = DATE_ADD(CURDATE, - INTERVAL 1 DAY) ) GROUP BY b.date ) GROUP BY a.date ) UNION SELECT f.name, SUM(c.sales) FROM 社員名簿テーブル AS f WHERE f.item_id IN ( SELECT c.item_id, FROM FROM 当日売り上げテーブル AS c WHERE c.date = CURDATE() HAVING SUM(c.sales) <= ANY ( SELECT SUM(d.sales) - 1000 FROM 当日売り上げテーブル AS d WHERE ( c.item_id = d.item_id ) HAVING ( d.date = DATE_ADD(CURDATE, - INTERVAL 1 DAY) ) GROUP BY d.date ) GROUP BY c.date )
▽3
●
井戸端さん ●50ポイント ベストアンサー |
フィールドのデータ型にもよるわね。
日付がdate型なら簡単よ。
CREATE TABLE `社員名簿テーブル` (item_id INT, name TEXT); INSERT INTO `社員名簿テーブル` VALUES(1001, '岡島'),(1002, '田中'); CREATE TABLE `当日売上テーブル` (item_id INT, date DATE, sales INT); INSERT INTO `当日売上テーブル` VALUES(1001, '2014/4/1', 3000), (1002, '2014/4/1', 2100),(1001, '2014/4/2', 3100),(1002, '2014/4/2', 1000); SELECT b.name, a.date, a.sales, c.date, c. sales FROM `当日売上テーブル` a LEFT JOIN `社員名簿テーブル` b ON b.item_id = a.item_id LEFT JOIN `当日売上テーブル` c ON c.item_id = a.item_id AND c.date = a.date -1 WHERE abs(a.sales - c.sales) > 1000;