1
votes

Comment additionner chaque élément de 3 tableaux

J'ai trois tableaux: Zone, Personne, Détail du solde

Zone:

$query= $con->query("SELECT * FROM Area WHERE Code NOT IN ('0004') GROUP BY AreaName");
while ($row = $query->fetch_array()) 
{
     $balancequery = $con->query("SELECT SUM(BalanceDetail.balance) as balance FROM Person JOIN BalanceDetail ON Person.customernumber= BalanceDetail.customernumber WHERE Person.code= '$row[Code]' AND period='2019-12-31'");
     $balancequery2 = $con->query("SELECT SUM(BalanceDetail.balance) as balance FROM Person JOIN BalanceDetail ON Person.customernumber= BalanceDetail.customernumber WHERE Person.code= '$row[Code]' AND period='2020-01-17'");
     $balancequery3 = $con->query("SELECT SUM(BalanceDetail.balance) as balance FROM Person JOIN BalanceDetail ON Person.customernumber= BalanceDetail.customernumber WHERE Person.code= '$row[Code]' AND period='2020-01-24'");
}

Personne:

id period       customernumber balance
1  2019-12-31   5000           50
2  2019-12-31   6000           150
3  2019-12-31   6005           140
4  2019-12-31   6100           40
5  2019-12-31   7000           20
6  2020-01-17   5000           150
7  2020-01-17   6000           40
8  2020-01-24   6100           180
9  2020-01-24   6000           170

Détail du solde:

id code personid personname customername customernumber
1  0001 1000     test1      loop         5000
2  0001 1000     test1      loop         7000
3  0002 1001     test2      loop2        6000
4  0003 1002     test3      loop3        6005
5  0001 1000     test1      loop5        6100

Je souhaite obtenir le solde de chaque article en fonction de leur indicatif régional et période. J'ai utilisé la requête suivante

Code  AreaName
0001  A 
0002  B
0003  C
0004  D

Je veux la combiner en un SQL, donc il n'y aura pas de requête dans la boucle while


0 commentaires

3 Réponses :


0
votes

Vous pouvez utiliser le groupe par

SELECT Person.Code, BalanceDetail.period, SUM(BalanceDetail.balance) as balance 
FROM Person JOIN BalanceDetail 
ON Person.customernumber= BalanceDetail.customernumber
WHERE Code IN (SELECT Code  FROM Area WHERE Code NOT IN ('0004'))
group by Person.Code, BalanceDetail.period


0 commentaires

0
votes
SELECT  bd.period,
        a.AreaName,
        SUM(bd.balance) as balance
    FROM Person AS p
    JOIN BalanceDetail AS bd ON p.customernumber = bd.customernumber
    JOIN Area AS a  ON a.code = p.code
    GROUP BY bd.period, p.code;

0 commentaires

0
votes

Vous pouvez utiliser l'agrégation conditionnelle pour résoudre ce problème, en additionnant uniquement les valeurs pertinentes pour chaque période:

code    balance 2019-12-31  balance 2020-01-17  balance 2020-01-24
1       110                 150                 180
2       150                 40                  170
3       140                 0                   0

Résultat:

SELECT a.code,
       SUM(CASE WHEN period='2019-12-31' THEN b.balance ELSE 0 END) AS `balance 2019-12-31`,
       SUM(CASE WHEN period='2020-01-17' THEN b.balance ELSE 0 END) AS `balance 2020-01-17`,
       SUM(CASE WHEN period='2020-01-24' THEN b.balance ELSE 0 END) AS `balance 2020-01-24`
FROM Area a
JOIN Person p ON p.code = A.code
JOIN BalanceDetail b ON b.customernumber = p.customernumber 
GROUP BY a.code

Démo sur SQLFiddle


2 commentaires

J'ai oublié d'écrire les résultats que je veux et je veux qu'ils s'affichent sous forme de colonne.


@SilverBullet C'est bon à entendre. Je suis heureux d'avoir pu aider.