【问题标题】:PHP array_sum not adding sqlsrv queryPHP array_sum 不添加 sqlsrv 查询
【发布时间】:2019-03-08 20:00:40
【问题描述】:

我正在使用 PHP 5.6 和 7.0.29 执行以下 SQLSRV 查询,当我得到结果时,我似乎无法使用 array_sum 添加(SUM)“grand_total”的总结果,甚至当我尝试循环它时。

$sql = "SELECT inv_trx.trx_date, datepart(day, datediff(day, 0, inv_trx.trx_date)/7 * 7)/7 + 1 AS WEEKNUMBER ,  DATEPART(WEEK, DATEADD(MM, DATEDIFF(MM,0,'".$datetime."'), 0))+ 1 AS WEEK_OF_MONTH,   inv_trx.trx_qty, inv_trx.unit_price, inv_trx.ord_qty, item.prod_cat, inv_trx.slsman_1, SUM(inv_trx.trx_qty * inv_trx.unit_price) AS grand_total

FROM dbo.customer customer, dbo.inv_trx inv_trx, dbo.item item, dbo.ord_hedr  ord_hedr

WHERE  datepart(day, datediff(day, 0, inv_trx.trx_date)/7 * 7)/7 + 1 = '1' AND customer.cust_no = inv_trx.cust_no AND customer.cust_no = ord_hedr.cust_no AND inv_trx.order_no = ord_hedr.order_no AND inv_trx.item_no = item.item_no AND 
inv_trx.manu_no = item.manu_no AND ((ord_hedr.ord_type='O') AND (inv_trx.trx_type='S') AND (ord_hedr.ord_class<>'M' And ord_hedr.ord_class<>'P') AND (customer.exclude_sa=0) OR (ord_hedr.ord_type='C') AND (inv_trx.trx_type='S') AND (ord_hedr.ord_class<>'M' And ord_hedr.ord_class<>'P') AND (customer.exclude_sa=0)) AND YEAR(inv_trx.trx_date) = '2018' AND MONTH(inv_trx.trx_date) = '7' GROUP BY  inv_trx.trx_date, DATEPART(WEEK,inv_trx.trx_date), inv_trx.trx_qty, inv_trx.unit_price, inv_trx.ord_qty, item.prod_cat, inv_trx.slsman_1  ";

$params = array();
$result = sqlsrv_query( $conn, $sql );
if( $result === false) {
    die( print_r( sqlsrv_errors(), true) ); 
}

while( $row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC) ) {



 ?>  <tr>
                    <td><?php echo $row['trx_date']->format('m/d/Y')?></td>
                    <td><?php echo $row['WEEKNUMBER']?></td>
                    <td><?php echo $row['trx_qty']?></td>
                    <td><?php echo $row['unit_price']?></td>
                    <td><?php echo $row['ord_qty']?></td>
                    <td><?php echo $row['prod_cat']?></td>
                    <td><?php echo $row['slsman_1']?></td>
                    <td><?php echo $row['grand_total']?></td>
                </tr> 
                 <?php

                  $group = array($row['grand_total']);
                   print_r(array_sum($group));
                  //echo $row['grand_total']; //result is the same

Array_sum 的结果是一样的,只是回显了 grand_total 本身。

示例:4.8 6 109.4 1.197 17.8 45.5 89 而不是总计 = 184.XX

这是因为我已经使用 SUM 来总计 inv_trx.trx_qty * inv_trx.unit_price 来形成 grand_total?

我怀疑这是我的阵列的问题,但我不确定。任何建议将不胜感激。

查询产生以下内容

Trx Date    Week    Trx QTY Price   Quantity    Category    Salesman    Total
09/02/2018  1         1   4.8        80          MAG          Mickey        4.8
09/02/2018  1         3    2         50          BOB          Donald         6
09/02/2018  1         4    27.35      4         POW           Goose       109.4

我想做的是得到总和,即grand_total。

【问题讨论】:

  • 您好,欢迎来到 SO。您的查询中有别名,但它们与表的名称相同,这有点失败。更大的问题是您使用的是 ANSI-89 样式连接。是时候开始使用已经存在超过 25 年的“现代”连接语法了。 sqlblog.org/2009/10/08/bad-habits-to-kick-using-old-style-joins 不要害怕在代码中添加一些空格进行格式化。其他人也许能够破译它。
  • 您确定查询正在执行您想要的操作吗?你有一个 OR 卡在一大堆 AND 的中间。这里有太多额外的括号,很难理解。
  • 就查询本身而言,我得到了我想要的结果,我只是无法对数组 grand_total 求和。我应该注意,我并不是真正的程序员。我一直在拼凑这些,边走边学
  • 我不认为你真的得到了你想要的结果,因为你有一个 OR 卡在中间。目前可能会产生结果,但肯定有问题。
  • 如果我将 (customer.exclude_sa=0) OR (ord_hedr.ord_type='C') 更改为“AND”,我会得到 0 个结果。

标签: php sql-server wampserver array-sum


【解决方案1】:

如果您的 T-SQL 语句返回行并且您想对结果集中每一行的值求和,您需要在 while () {...} 之前定义您的数组,然后添加每一行的值:

<?php
...

# Statement
$sql = ' ... your statement ...';
$params = array();
$result = sqlsrv_query($conn, $sql, $params);
if ($result === false) {
    die( print_r(sqlsrv_errors(), true)); 
}

# Results
$total = array();
while ($row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC)) {
?>  
    <tr>
    <td><?php echo $row['trx_date']->format('m/d/Y')?></td>
    <td><?php echo $row['WEEKNUMBER']?></td>
    <td><?php echo $row['trx_qty']?></td>
    <td><?php echo $row['unit_price']?></td>
    <td><?php echo $row['ord_qty']?></td>
    <td><?php echo $row['prod_cat']?></td>
    <td><?php echo $row['slsman_1']?></td>
    <td><?php echo $row['grand_total']?></td>
    </tr>
<?php
    $total[] = $row['grand_total'];
    echo 'Grand total after current row: '.array_sum($total).'<br>';
}   

# Total after all rows
echo 'Grand total after all rows: '.array_sum($total).'<br>';

...
?>

【讨论】:

    【解决方案2】:

    这对于评论来说太长了,并且没有回答您目前正在苦苦挣扎的部分,但是您可以使用别名、正确的连接语法和一些类似这样的格式大大简化您的整个查询。

    SELECT it.trx_date
        , datepart(day, datediff(day, 0, it.trx_date) / 7 * 7) / 7 + 1 AS WEEKNUMBER 
        , DATEPART(WEEK, DATEADD(month, DATEDIFF(month, 0, '".$datetime."'), 0)) + 1 AS WEEK_OF_MONTH
        , it.trx_qty
        , it.unit_price
        , it.ord_qty
        , i.prod_cat
        , it.slsman_1
        , SUM(it.trx_qty * it.unit_price) AS grand_total
    FROM dbo.customer c
    join dbo.inv_trx it on c.cust_no = it.cust_no 
    join dbo.item i on it.item_no = i.item_no 
                        AND it.manu_no = i.manu_no 
    join dbo.ord_hedr oh on c.cust_no = oh.cust_no
                        AND it.order_no = oh.order_no 
    WHERE  datepart(day, datediff(day, 0, it.trx_date) / 7 * 7) / 7 + 1 = 1
        AND oh.ord_type in ('O', 'C')
        AND it.trx_type = 'S'
        AND oh.ord_class not in ('M', 'P')
        AND c.exclude_sa = 0 
        AND YEAR(it.trx_date) = 2018 --date functions return integers not strings
        AND MONTH(it.trx_date) = 7 
    GROUP BY it.trx_date
        , DATEPART(WEEK, it.trx_date)
        , it.trx_qty
        , it.unit_price
        , it.ord_qty
        , i.prod_cat
        , it.slsman_1 
    

    --编辑--

    添加 GROUPING SETS 的示例。

    我会查看 this article 以了解其工作原理。

    SELECT it.trx_date
        , datepart(day, datediff(day, 0, it.trx_date) / 7 * 7) / 7 + 1 AS WEEKNUMBER 
        , DATEPART(WEEK, DATEADD(month, DATEDIFF(month, 0, '".$datetime."'), 0)) + 1 AS WEEK_OF_MONTH
        , it.trx_qty
        , it.unit_price
        , it.ord_qty
        , i.prod_cat
        , it.slsman_1
        , SUM(it.trx_qty * it.unit_price) AS grand_total
    FROM dbo.customer c
    join dbo.inv_trx it on c.cust_no = it.cust_no 
    join dbo.item i on it.item_no = i.item_no 
                        AND it.manu_no = i.manu_no 
    join dbo.ord_hedr oh on c.cust_no = oh.cust_no
                        AND it.order_no = oh.order_no 
    WHERE  datepart(day, datediff(day, 0, it.trx_date) / 7 * 7) / 7 + 1 = 1
        AND oh.ord_type in ('O', 'C')
        AND it.trx_type = 'S'
        AND oh.ord_class not in ('M', 'P')
        AND c.exclude_sa = 0 
        AND YEAR(it.trx_date) = 2018 --date functions return integers not strings
        AND MONTH(it.trx_date) = 7 
    GROUP BY GROUPING SETS((it.trx_date
        , DATEPART(WEEK, it.trx_date)
        , it.trx_qty
        , it.unit_price
        , it.ord_qty
        , i.prod_cat
        , it.slsman_1), ())
    

    【讨论】:

    • 谢谢。它并没有解决我的核心问题,但它确实给了我编码的新方向!格式非常干净并且有效。我正在查看它,我很震惊(与我的垃圾代码相比)非常感谢!。
    • 很高兴它有帮助。现在,也许有 php 知识的人可以帮助您完成手头的任务。可惜那不是我。
    • 让我问你这个;有没有办法在查询本身中实现这一点?你看我有 WEEKNUMBER,我的最终目标是按周计算该月的总数。第 1-5 周总计,这是我的工作。
    • 是的,使用 GROUPING SETS 应该可以做到这一点。一秒钟,我将编辑我的答案。
    • 我将不得不使用它,我收到一个错误:[SQL Server]'SETS' 附近的语法不正确。 ) )
    猜你喜欢
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多