人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQL

下記条件のデータ抽出SQL文を教えて下さい。

テーブル、入っているデータ例は画像をご覧下さい。

★このDBの利用目的:
各社員の日々の売上を記録するDB.

★やりたいこと:
当日と前日の売上を比較し、前日より+ OR - 両方で1000円以上変動がある社員名と前日・当日の売上を抽出したい。


よろしくお願いします。

1398511895
●拡大する

●質問者: webtomake
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● lang_and_engine
●25ポイント

テーブルを自分自身と比較するような抽出処理を行なう場合,相関サブクエリを使えば実現できます。

※今日のデータと昨日のデータで同一のテーブルを比較対象にしている


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
;


2 ● なむうぉんす
●25ポイント

自信が無いのでコメントに書いたのですが、あまりにも見にくかったので、回答で失礼します。
手元に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;
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ