0

このクエリを考慮すると:

SELECT DATE_FORMAT(t.date, "%Y") training_year, 
COUNT(i.id) nb_trainees, 
nb_canceled_trainings, 
nb_done_trainings, 
(nb_canceled_trainings / (nb_canceled_trainings + nb_done_trainings)) cancellation_rate
FROM (
    SELECT COUNT(`trainings_trainings`.`id`) nb_canceled_trainings
    FROM  `trainings_trainings`
    WHERE `trainings_trainings`.`id_status` = 5
    AND DATE_FORMAT(`trainings_trainings`.`date`, "%Y") = training_year
) nct, (
    SELECT COUNT(`trainings_trainings`.`id`) nb_done_trainings
    FROM  `trainings_trainings`
    WHERE `trainings_trainings`.`id_status` IN (6, 7)
    AND DATE_FORMAT(`trainings_trainings`.`date`, "%Y") = training_year
) ndt,
`trainings_inscriptions` i
INNER JOIN `trainings_trainings` t ON i.`id_training` = t.id
GROUP BY training_year;

問題は、サブクエリで training_year にアクセスできないことです。どうやってやるの?

私の最初の試みは、サブクエリを SELECT 部分に移動することでしたが、その後、これらのサブクエリのエイリアスを cancel_rate の計算に使用できません。

編集

@Jafarのクエリといくつかの変更で期待される結果があります:

SELECT current_year, nb_trainees, nb_canceled_trainings, nb_done_trainings, 
        (nb_canceled_trainings / (nb_canceled_trainings + nb_done_trainings)) cancellation_rate,
        (nb_trainees / nb_done_trainings) filling
FROM (
    SELECT COUNT(CASE WHEN `t`.`id_status` = 5 THEN 1 END) nb_canceled_trainings,
    COUNT(CASE WHEN `t`.`id_status` IN (6, 7) THEN 1 END) nb_done_trainings, (
        SELECT COUNT(`ti`.`id`) nb_trainees
        FROM `trainings_inscriptions` `ti`
        INNER JOIN `trainings_trainings` `tt` ON `ti`.`id_training` = `tt`.`id`
        WHERE DATE_FORMAT (`tt`.`date`, "%Y") = DATE_FORMAT (`t`.`date`, "%Y")
    ) nb_trainees, DATE_FORMAT (`t`.`date`, "%Y") current_year
    FROM `trainings_trainings` `t`
    GROUP BY DATE_FORMAT (`t`.`date`, "%Y")
) dummy;

これは私が得るものです:

+------+----------+----------+------+--------+---------+
| year | trainees | canceled | done | ratio  | filling |
+------+----------+----------+------+--------+---------+
| 2012 |        0 |        0 |    0 | NULL   | NULL    |
| 2013 |       58 |        0 |    2 | 0.0000 | 29.0000 |
| 2014 |        2 |        1 |    0 | 1.0000 | NULL    |
+------+----------+----------+------+--------+---------+
4

2 に答える 2

0

テーブル名の前にエイリアスを配置して、サブクエリ自体の中で使用することができます。外部テーブルを参照している場合は、そのフィールドを選択してから外部テーブルと結合することをお勧めします。


EDIT v2.0は、必要な結果を得るためにクエリを変更しました

    SELECT YEAR,
       TRAINEES,
       NCT,
       NDT,
       NCT / (NCT + NDT) RATIO
  FROM (  SELECT COUNT (CASE WHEN T.ID_STATUS = 5 THEN 1 END) NCT,
                 COUNT (CASE WHEN T.ID_STATUS IN (6, 7) THEN 1 END) NDT,
                 (SELECT COUNT (TI.ID) TRAINEES
                    FROM trainings_inscriptions TI
                   WHERE TI.id_training = T.ID)
                    TRAINEES,
                 DATE_FORMAT (T.date, "%Y") year
            FROM trainings_trainings t
        GROUP BY DATE_FORMAT (T.date, "%Y"))
于 2013-08-13T13:50:29.370 に答える
0

このようにサブクエリを変更してみてください

SELECT COUNT(`trainings_trainings`.`id`) nb_canceled_trainings,
  DATE_FORMAT(`trainings_trainings`.`date`, "%Y") training_year
FROM  `trainings_trainings`
WHERE `trainings_trainings`.`id_status` = 5
GROUP BY training_year

次に、メインクエリtraining_yearのセクションでエイリアスのフィールドを使用できます。WHERE

于 2013-08-13T13:46:18.070 に答える