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
3 Réponses :
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
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;
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
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.