私が必要とするのは、集約テーブルと特異テーブルのデータを報告できるSQLクエリです。私が持っている現在のデータベースは以下の通りです。一日のための単一の従業員の業績(とらコールの数、actionedチケットの数)Day
トラック内集計データを含むMySQL結合
CREATE TABLE IF NOT EXISTS `faults_days` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`employee_id` int(11) NOT NULL,
`day_date` date NOT NULL,
`actioned_calls_out` int(11) NOT NULL,
`actioned_calls_in` int(11) NOT NULL,
`actioned_tickets` int(11) NOT NULL,
)
CREATE TABLE IF NOT EXISTS `faults_departments` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(40) NOT NULL,
)
CREATE TABLE IF NOT EXISTS `faults_employees` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`team_id` int(11) NOT NULL,
`name` varchar(127) NOT NULL,
)
CREATE TABLE IF NOT EXISTS `faults_qos` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`qos_date` datetime NOT NULL,
`employee_id` int(11) NOT NULL,
`score` double NOT NULL,
)
CREATE TABLE IF NOT EXISTS `faults_teams` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`department_id` int(11) NOT NULL,
`name` varchar(40) NOT NULL,
)
行。 Qosは、1日の従業員の品質の尺度です(1日に複数のQosが存在する可能性があります。取得する必要があるのは平均スコアです)。また、Qosは従業員がデータベースに掲載されていない日に実行することもできますが、これは依然としてレポートに表示する必要があります。
必要な最終結果は4つのレポートで、従業員のパフォーマンスをさまざまな列でグループ化して示しています。 1日の単一従業員の業績、一定期間にわたる従業員の総実績、一定期間にわたるチームの業績、および一定期間にわたる部門全体の業績の内訳。
私の問題は、現在のクエリがちょっと複雑で、Day
データとQos
データの2つの個別のクエリが必要なことです。私のPHPアプリケーションは、レポートを出力する前にデータを結合します。 私が望むのは、合計パフォーマンスと平均品質スコアの両方を返す単一のクエリです。私は従業員のパフォーマンスを示さなければならない
現在のクエリは、次のとおりです。
SELECT
`Employee`.`name` ,
`Team`.`name` ,
`Department`.`name` ,
SUM( `Day`.`actioned_calls_in`) + SUM( `Day`.`actioned_calls_out`) ,
SUM( `Day`.`actioned_tickets`)
FROM
`faults_days` AS `Day`
JOIN
`faults_employees` AS `Employee` ON `Day`.`employee_id` = `Employee`.`id`
JOIN
`faults_teams` AS `Team` ON `Employee`.`team_id` = `Team`.`id`
JOIN
`faults_departments` AS `Department` ON `Team`.`department_id` = `Department`.`id`
WHERE
`Day`.`day_date` >= '2011-06-01'
AND `Day`.`day_date` <= '2011-06-07'
GROUP BY `Employee`.`id`
WITH ROLLUP
と
SELECT
`Employee`.`name` ,
`Team`.`name` ,
`Department`.`name` ,
COUNT( `Qos`.`score`) ,
AVG( `Qos`.`score`)
FROM
`faults_qos` AS `Qos`
JOIN
`faults_employees` AS `Employee` ON `Qos`.`employee_id` = `Employee`.`id`
JOIN
`faults_teams` AS `Team` ON `Employee`.`team_id` = `Team`.`id`
JOIN
`faults_departments` AS `Department` ON `Team`.`department_id` = `Department`.`id`
WHERE
`Qos`.`qos_date` >= '2011-06-01'
AND `Qos`.`qos_date` <= '2011-06-07'
GROUP BY `Employee`.`id`
WITH ROLLUP
私はまた、単にQoSテーブルに参加しようとしたが、それは複数行を返すため、それが台無しにまた、FULL OUTER JOIN
機能がないために問題があります。
EDIT: 私はこれでいくつかの小さな進歩を遂げてきました。サブクエリを使用する方法がありますが、私がやっていることはすべて純粋な推測です。ここでは、私が今までに何を得ているのかは、Day
テーブルとQos
テーブルの両方にエントリがある場合にのみ表示されます。これは私が望むものではなく、上記のさまざまなグループをどのように展開するのか分かりません。
SELECT
`Employee`.`name` ,
`Team`.`name` ,
`Department`.`name`,
`Day`.`Calls`,
`Day`.`Tickets`,
`Qos`.`NumQos`,
`Qos`.`Score`
FROM `faults_employees` AS `Employee`
JOIN
`faults_teams` AS `Team` ON `Employee`.`team_id` = `Team`.`id`
JOIN
`faults_departments` AS `Department` ON `Team`.`department_id` = `Department`.`id`
JOIN
(SELECT
`Day`.`employee_id` AS `eid`,
SUM(`Day`.`actioned_calls_in`) + SUM(`Day`.`actioned_calls_out`) AS `Calls`,
SUM(`Day`.`actioned_tickets`) AS `Tickets`
FROM `faults_days` AS `Day`
WHERE
`Day`.`day_date` = '2011-03-02'
GROUP BY `Day`.`employee_id`
) AS `Day`
ON `Day`.`eid` = `Employee`.`id`
JOIN
(SELECT
`Qos`.`employee_id` AS qid,
COUNT(`Qos`.`id`) AS `NumQos`,
AVG(`Qos`.`score`) AS `Score`
FROM `faults_qos` AS `Qos`
WHERE
`Qos`.`qos_date` = '2011-03-02'
GROUP BY `Qos`.`employee_id`
) AS `Qos`
ON `Qos`.`qid` = `Employee`.`id`
GROUP BY `Employee`.`id`
これは、「私のために仕事をしてくださいのウェブサイトではありません。これまでに何を持っていますか?データベーススキーマを投稿します。 – Halcyon
もあいまいです。あなたが持っている問題/エラーを投稿してください。 – dynamic
コメントを評価してください。私はすでに私がすでに持っているものを含めるために質問を編集しました。 –