【问题标题】:How to sum each item from 3 tables如何总结 3 个表格中的每个项目
【发布时间】:2020-02-10 03:39:32
【问题描述】:

我有三个表:Area、Person、Balance Detail

区域:

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,所以while循环中不会有查询

【问题讨论】:

    标签: php mysql sql performance


    【解决方案1】:

    您可以使用条件聚合来解决这个问题,只需对每个时期的相关值求和:

    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
    

    Demo on SQLFiddle

    【讨论】:

    • 我忘记写我想要的结果,我希望它显示为列这完全是我需要的,它可以工作。
    • @SilverBullet 很高兴听到。我很高兴能帮上忙。
    【解决方案2】:

    您可以使用分组方式

    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
    

    【讨论】:

      【解决方案3】:
      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;
      

      【讨论】:

        猜你喜欢
        • 2020-05-17
        • 2020-06-09
        • 1970-01-01
        • 2020-11-26
        • 2018-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多