Как сложить каждый элемент из 3 таблиц - PullRequest
1 голос
/ 10 февраля 2020

У меня есть три таблицы: Площадь, Персона, Деталь баланса

Площадь:

Code  AreaName
0001  A 
0002  B
0003  C
0004  D

Персона:

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

Сведения о балансе:

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

Я хочу получить баланс каждого элемента на основе их кода города и периода. Я использовал следующий запрос

$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'");
}

Я хочу объединить его в один sql, поэтому при выполнении l oop

запроса не будет.

Ответы [ 3 ]

0 голосов
/ 10 февраля 2020
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 голосов
/ 10 февраля 2020

Вы можете использовать условное агрегирование для решения этой проблемы, только суммируя соответствующие значения для каждого периода:

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

Вывод:

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

Демонстрация по SQLFiddle

0 голосов
/ 10 февраля 2020

Вы можете использовать группу по

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...