J'ai besoin d'obtenir le total de chaque allocation à l'aide de la requête SQL. Maintenant, j'utilise deux requêtes pour obtenir des résultats. Mais je voulais obtenir un résultat en exécutant une seule requête pour minimiser le temps et le code. Voici ma première question.
SELECT DISTINCT master.account_code, master.account_name FROM 0_chart_master AS master WHERE master.account_type IN (60,61,233)
À partir de la requête ci-dessus, il affichera les résultats du code de compte comme ci-dessous.
1700 Payroll Expenses
1710 Rent
1720 Travel Expenses
4000 Miscellaneous
Et à partir de chaque code de compte, j'ai utilisé pour interroger la requête ci-dessous comme celle-ci.
SELECT SUM(amount) FROM 0_gl_trans WHERE account='1700' AND tran_date >= '2017-10-31' AND tran_date <= '2017-11-30'
SELECT SUM(amount) FROM 0_gl_trans WHERE account='1710' AND tran_date >= '2017-10-31' AND tran_date <= '2017-11-30'
SELECT SUM(amount) FROM 0_gl_trans WHERE account='1720' AND tran_date >= '2017-10-31' AND tran_date <= '2017-11-30'
SELECT SUM(amount) FROM 0_gl_trans WHERE account='4000' AND tran_date >= '2017-10-31' AND tran_date <= '2017-11-30'
J'ai besoin d'une solution simplifiée pour cette situation difficile.
4 réponses
Vous pouvez obtenir les totaux dans une colonne supplémentaire pour votre premier résultat:
SELECT master.account_code, master.account_name, COALESCE(SUM(trans.amount), 0) AS total
FROM 0_chart_master AS master
LEFT JOIN 0_gl_trans AS trans
ON trans.account = master.account_code
AND trans.tran_date BETWEEN '2017-10-31' AND '2017-11-30'
WHERE master.account_type IN (60,61,233)
GROUP BY master.account_code, master.account_name
Vous pouvez simplement filtrer les comptes et les agréger:
SELECT account, sum(amount)
FROM 0_gl_trans
WHERE account in (
select account
from 0_chart_master
where account_type IN (60,61,233)
)
AND tran_date >= '2017-10-31'
AND tran_date <= '2017-11-30'
group by account;
Vous pourriez faire avec une seule sélection de cette façon
select master.account_code, master.account_name,
sum( case when account='1700' then amount else 0 end ) tot_1700_payroll_Expenses,
sum( case when account='1710' then amount else 0 end ) tot_1710_Rent,
sum( case when account='1720' then amount else 0 end ) tot_1720_Travel_Expenses,
sum( case when account='4000' then amount else 0 end ) tot_4000_Miscellaneous
FROM 0_gl_trans WHERE tran_date >= '2017-10-31' AND tran_date <= '2017-11-30'
INNER JOIN _chart_master AS master ON master.account_code = 0_gl_trans.account
and master.account_type IN (60,61,233)
group by master.account_code, master.account_name
Vous pouvez utiliser la première requête comme sous-requête pour obtenir un account code
pertinent et vous pouvez utiliser Between...AND
pour une condition sur les dates. Essayez la requête suivante:
SELECT COALESCE(SUM(amount), 0),
account
FROM 0_gl_trans
WHERE account in (SELECT DISTINCT master.account_code
FROM 0_chart_master AS master
WHERE master.account_type IN (60,61,233)
)
AND tran_date between '2017-10-31' AND '2017-11-30'
group by account;
J'espère que cela aide!
De nouvelles questions
mysql
MySQL est un système de gestion de base de données relationnelle (RDBMS) gratuit et open source qui utilise SQL (Structured Query Language). N'UTILISEZ PAS cette balise pour d'autres bases de données telles que SQL Server, SQLite, etc. Ce sont des bases de données différentes qui utilisent toutes leurs propres dialectes SQL pour gérer les données.