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.

0
Kvvaradha 18 nov. 2017 à 20:52

4 réponses

Meilleure réponse

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
4
trincot 18 nov. 2017 à 17:58

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;
1
Gurwinder Singh 18 nov. 2017 à 17:57

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
1
scaisEdge 18 nov. 2017 à 18:03

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!

1
Harshil Doshi 18 nov. 2017 à 18:18
47369231