J'ai une requête dans MySQL.
Requête complète
Expense Tour_sub_code login_id Count DAILY ALLOWANCE MOS-EUROPE100119 vinod.kumbala 20 DAILY ALLOWANCE Test vinod.kumbala 44
Résultat
SELECT tc.expense AS expense, tc.tour_sub_code, tc.login_id, (SELECT COUNT(*) FROM (SELECT * FROM `attendance_master` WHERE `delete_flag` = 'F' AND login_id = 'vinod.kumbala' AND `tour_sub_code` = tc.`tour_sub_code` GROUP BY `device_date`) t1) AS newNoOfdays FROM tc_wallet tc WHERE tc.login_id = 'vinod.kumbala' AND tc.expense = 'Daily Allowance' AND tc.delete_flag = 'F' AND tc.status != 'reject'
Au départ, je récupère les données de la table tc_wallet
.
Maintenant, mon exigence est que je dois trouver le nombre total de participants pour un tour_sub_code
particulier. Le nombre de participants peut être trouvé dans le tableau participation_master
pour ce tour_sub_code
particulier.
J'ai donc inclus une requête Select imbriquée qui est
Sélection imbriquée
(SELECT COUNT(*) FROM (SELECT * FROM `attendance_master` WHERE `delete_flag` = 'F' AND login_id = 'vinod.kumbala' AND `tour_sub_code` = tc.`tour_sub_code` GROUP BY `device_date`) t1) AS newNoOfdays
Requête complète
Expense Tour_sub_code login_id DAILY ALLOWANCE MOS-EUROPE100119 vinod.kumbala DAILY ALLOWANCE Test vinod.kumbala
Maintenant, cette requête me donne une erreur en tant que
Colonne inconnue 'tc.tour_sub_code' dans 'clause where'
Résultat attendu
SELECT tc.expense AS expense, tc.tour_sub_code, tc.login_id FROM tc_wallet tc WHERE tc.login_id = 'vinod.kumbala' AND tc.expense = 'Daily Allowance' AND tc.delete_flag = 'F' AND tc.status != 'reject'
Puis-je savoir où je me trompe?
Y a-t-il également une autre façon d'obtenir des résultats comme en utilisant JOINS?
4 Réponses :
Essayez ceci:
SELECT tc.expense AS expense, tc.tour_sub_code, tc.login_id, count(*) as count FROM tc_wallet tc INNER JOIN attendance_master am ON tc.tour_sub_code = am.tour_sub_code AND tc.login_id = am.login_id WHERE tc.login_id = 'vinod.kumbala' AND tc.expense = 'Daily Allowance' AND tc.delete_flag = 'F' AND tc.status != 'reject' GROUP BY tc.expense AS expense, tc.tour_sub_code, tc.login_id
Essayez ceci ---
SELECT tc.expense AS expense, tc.tour_sub_code, tc.login_id, (SELECT COUNT(am.*) FROM `attendance_master` as am WHERE am.delete_flag = 'F' AND am.login_id = 'vinod.kumbala' AND am.tour_sub_code = tc.tour_sub_code GROUP BY am.device_date) AS count FROM tc_wallet tc WHERE tc.login_id = 'vinod.kumbala' AND tc.expense = 'Daily Allowance' AND tc.delete_flag = 'F' AND tc.status != 'reject'
Pouvez-vous essayer ceci:
select tc.expense AS expense, tc.tour_sub_code, tc.login_id, newNoOfdays.countVal from tc_wallet tc inner join ( select tour_sub_code, count('A') 'countval' from attendance_master ascs (nolock) group by tour_sub_code) as newNoOfdays on newNoOfdays.tour_sub_code = tc.tour_sub_code where tc.login_id = 'vinod.kumbala' AND tc.expense = 'Daily Allowance' AND tc.delete_flag = 'F' AND tc.status != 'reject'
Dans la sous-requête la plus interne, vous faites référence à une colonne de la requête la plus externe. Cela n'est pas autorisé pour les sous-requêtes dans la clause FROM (tables dérivées). Cependant, vous n'avez pas besoin de cette sous-requête. Ce dont vous avez besoin, c'est de COUNT (DISTINCT device_date)
Réécrire
SELECT tc.expense AS expense, tc.tour_sub_code, tc.login_id, COUNT(DISTINCT device_date) AS newNoOfdays FROM tc_wallet tc LEFT JOIN attendance_master am ON am.tour_sub_code = tc.tour_sub_code AND am.delete_flag = 'F' AND am.login_id = 'vinod.kumbala' WHERE tc.login_id = 'vinod.kumbala' AND tc.expense = 'Daily Allowance' AND tc.delete_flag = 'F' AND tc.status != 'reject'
en
(SELECT COUNT(DISTINCT device_date) FROM `attendance_master` WHERE `delete_flag` = 'F' AND login_id = 'vinod.kumbala' AND `tour_sub_code` = tc.`tour_sub_code` ) AS newNoOfdays
Vous pouvez également réécrire la requête complète en une requête LEFT JOIN:
(SELECT COUNT(*) FROM (SELECT * FROM `attendance_master` WHERE `delete_flag` = 'F' AND login_id = 'vinod.kumbala' AND `tour_sub_code` = tc.`tour_sub_code` GROUP BY `device_date`) t1) AS newNoOfdays