1398511895 MySQL


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

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

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

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


よろしくお願いします。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2014/04/26 20:31:35
  • 終了:2014/04/29 23:40:31

ベストアンサー

id:watercooler No.3

井戸端さん回答回数289ベストアンサー獲得回数512014/04/27 18:16:38

ポイント50pt

フィールドのデータ型にもよるわね。
日付が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;

その他の回答(2件)

id:language_and_engineering No.1

lang_and_engine回答回数170ベストアンサー獲得回数632014/04/26 21:59:57

ポイント25pt

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

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


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
;

id:sasada No.2

sasada回答回数1482ベストアンサー獲得回数1332014/04/26 22:00:40

ポイント25pt

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

id:watercooler No.3

井戸端さん回答回数289ベストアンサー獲得回数512014/04/27 18:16:38ここでベストアンサー

ポイント50pt

フィールドのデータ型にもよるわね。
日付が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;

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません