0

異なるテーブルの 2 つの行を減算したい:

view呼ばれるを作成しました。leave_takentableleave_balance

両方のテーブルからこの結果が必要です:

leave_taken.COUNT(*) - leave_balance.balance

およびグループ化leave_type_id_leave_type

両表のコード

-----------------Leave_Taken を表示-----------

CREATE ALGORITHM = UNDEFINED DEFINER=`1`@`localhost` SQL SECURITY DEFINER 
VIEW `leave_taken` 
AS 
   select 
     `leave`.`staff_leave_application_staff_id_staff` AS `staff_leave_application_staff_id_staff`,
     `leave`.`leave_type_id_leave_type` AS `leave_type_id_leave_type`,
     count(0) AS `COUNT(*)` 
   from 
   (
      `leave` 
      join `staff` on((`staff`.`id_staff` = `leave`.`staff_leave_application_staff_id_staff`))
   ) 
   where (`leave`.`active` = 1) 
   group by `leave`.`leave_type_id_leave_type`;

----------------テーブル leave_balance----------

CREATE TABLE IF NOT EXISTS `leave_balance` (
  `id_leave_balance` int(11) NOT NULL AUTO_INCREMENT,
  `staff_id_staff` int(11) NOT NULL,
  `leave_type_id_leave_type` int(11) NOT NULL,
  `balance` int(3) NOT NULL,
  `date_added` date NOT NULL,
  PRIMARY KEY (`id_leave_balance`),
  UNIQUE KEY `id_leave_balance_UNIQUE` (`id_leave_balance`),
  KEY `fk_leave_balance_staff1` (`staff_id_staff`),
  KEY `fk_leave_balance_leave_type1` (`leave_type_id_leave_type`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

---------- テーブル休暇 ----------

CREATE TABLE IF NOT EXISTS `leave` (
  `id_leave` int(11) NOT NULL AUTO_INCREMENT,
  `staff_leave_application_id_staff_leave_application` int(11) NOT NULL,
  `staff_leave_application_staff_id_staff` int(11) NOT NULL,
  `leave_type_id_leave_type` int(11) NOT NULL,
  `date` date NOT NULL,
  `active` int(11) NOT NULL DEFAULT '1',
  `date_updated` date NOT NULL,
  PRIMARY KEY (`id_leave`,`staff_leave_application_id_staff_leave_application`,`staff_leave_application_staff_id_staff`),
  KEY `fk_table1_leave_type1` (`leave_type_id_leave_type`),
  KEY `fk_table1_staff_leave_application1` (`staff_leave_application_id_staff_leave_application`,`staff_leave_application_staff_id_staff`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=32 ;
4

1 に答える 1

1

うーん、まだ十分な情報が提供されていないと思います。いくつかのサンプル データと期待される出力 (表形式) があると非常に役立ちますそうは言っても、私はあなたが働き始めることができる何かを持っているかもしれません. このクエリは、すべてのスタッフ メンバーを検索し、現在の休暇 (種類ごとにグループ化) を計算し、休暇の種類ごとに、それと残りの休暇との差を決定します。それを見て、さらに重要なことに (おそらく)ここで使用した sqlfiddleにはサンプル データが含まれています (これがデータの正しいパスであるかどうかを判断するために非常に重要です)。

SELECT
    staff.id_staff,
    staff.name,
    COUNT(`leave`.id_leave) AS leave_count,
    leave_balance.balance,
    (COUNT(`leave`.id_leave) - leave_balance.balance) AS leave_difference,
    `leave`.leave_type_id_leave_type AS leave_type
  FROM
    staff
    JOIN `leave` ON staff.id_staff = `leave`.staff_leave_application_staff_id_staff
    JOIN leave_balance ON
      (
        staff.id_staff = leave_balance.staff_id_staff
        AND `leave`.leave_type_id_leave_type = leave_balance.leave_type_id_leave_type
      )
  WHERE 
    `leave`.active = 1
  GROUP BY
    staff.id_staff, leave_type;

幸運を!

于 2013-01-22T17:43:16.250 に答える