【问题标题】:PHP MSSQL : How to display output when query return no rowPHP MSSQL:查询返回无行时如何显示输出
【发布时间】:2012-06-21 06:58:12
【问题描述】:

我的 PHP-MSSQL 查询有问题。 我有一个连接表,需要给出这样的结果:

    Department        Group A              Group B           Total A+B
                 WORKHOUR A OTHOUR A    WORKHOUR B OTHOUR B      WORKHOUR  OTHOUR
    HR             10         15     25   0               35       15
    IT              5          5                               5        5
    Admin                                    12   12              12       12

查询将计算每个给定日期有多少员工(管理员将输入数据,一旦提交,查询将给出上述结果)。

问题是,当没有要显示的行时,最终输出是一团糟。该列向右移动

即: IT中唯一的A组 仅管理员中的 B 组

Department        Group A              Group B           Total A+B
             WORKHOUR A OTHOUR A WORKHOUR B OTHOUR B      WORKHOUR  OTHOUR
HR      10       15       25     0               35      15
IT       5        5        5         5
Admin   12       12       12        12

我的问题是,如何防止这种情况发生? 我已经用 While.... if else.. 但结果仍然一样。 如果没有要返回的行,如何显示输出“0”? 回声“0”;

这是我的查询:

    select DD.DPT_ID,DPT.DEPARTMENT_NAME,TU.EMP_GROUP, sum(DD.WORK_HOUR) AS  WORK_HOUR,      
    sum(DD.OT_HOUR) AS OT_HOUR
    FROM DEPARTMENT_DETAIL DD
    left join DEPARTMENT DPT
    ON (DD.DEPT_ID=DPT.DEPT_ID)
    LEFT JOIN TBL_USERS TU
    ON (TU.EMP_ID=DD.EMP_ID) 
    WHERE DD_DATE>='2012-01-01'
    AND DD_DATE<='2012-01-31'
    AND TU.EMP_GROUP!=2
    GROUP BY DD.DEPT_ID, DPT.DEPARTMENT_NAME,TU.EMP_GROUP
    ORDER BY DPT.DEPARTMENT_NAME

这是我使用的逻辑之一,但没有返回我想要的结果::

    while($row = mssql_fetch_array($displayResult))
{


if ((!$row["WORK_HOUR"])&&(!$row["OT_HOUR"]))

{
echo "<td >";
echo "empty";
echo "&nbsp;</td>";

echo "<td >";
echo "empty";
echo "&nbsp;</td>";

}
else 

{
echo "<td>";
echo $row["WORK_HOUR"];
echo "&nbsp;</td>";

echo "<td>";
echo $row["OT_HOUR"];
echo "&nbsp;</td>";

}



}

请帮忙。我已经这样做了2天。 @__@

【问题讨论】:

  • 什么是php代码?会不会是php逻辑的问题?
  • 我写了一个答案来解决SQL中的一个问题,因为你只粘贴了SQL代码。但是您的问题是 PHP/标记问题!如果没有您用来生成输出的代码,我们无法解决这个问题!
  • 你也可以使用 SELECT IFNULL(my_column,0) 如果 column 的结果为空,这将产生 0
  • @raheelshan 这是我最初的答案,但因为这是一个演示问题,所以我删除了它。
  • @LiangliangZheng :我已经添加了上面的 php 代码。它不起作用。请帮忙。

标签: php sql-server


【解决方案1】:

希望我没有误解你的问题。缺少某些行的原因是在某些情况下您甚至没有得到任何 tup。

例如,如果我有一个简单的表 t1(key1 varchar(200), key2 varchar(200), val integer), 我写了一个类似select key1, key2, sum(val) from t1 group by key1, key2;的查询

假设值是 -

apple week1 4
apple week2 5
pear  week1 3
pear  week1 3
apple week2 3
apple week2 4
apple week1 5

通过查询,我永远不会得到 (pear, week2) => 一些值。

同样,您甚至可能不会触发像 (!$row["WORK_HOUR"])&amp;&amp;(!$row["OT_HOUR"]) 这样的条件检查

我希望下面的代码会有所帮助。

$results = array();

$allDepts = array();
$allGroups = array();

while($row = mssql_fetch_array($displayResult))
{
    $deptId = $row['DPT_ID'];
    $deptName = $row['DEPARTMENT_NAME'];
    $group = $row['EMP_GROUP'];
    $workHours = $row['WORK_HOUR'];
    $otHours = $row['OT_HOUR'];

    // set up a thorough list of depts & groups
    $allDepts[$deptId] = $deptName;
    $allGroups[$group] = $group;

    // store the values of hours
    $results[$deptId][$group]['work'] = $workHours;
    $results[$deptId][$group]['ot'] = $otHours;
}

// go through all possible combination of (dept, groups)
foreach($allDepts as $deptId => $deptName) {
    echo "<tr><td>$deptName</td>\n";
    foreach($allGroups as $group) {
        $workHours = $results[$deptId][$group]['work'];
        printTd($workHours);
        $otHours = $results[$deptId][$group]['ot'];
        printTd($otHours);
    }
    echo "</tr>\n";
}

function printTd( $value ) {
    $value = $value ? $value:"empty";
    echo "<td>$value</td>\n";
}

【讨论】:

  • 这很棒。但如何合计?我需要计算每行(部门)(最右列)的总工作时间,总 ot,然后在每列底部返回总计。 (我真的不熟悉数组)
  • 您可以分配一个新数组 $totals[ $deptName ][ 'work' or 'ot' ],并将 $workHours & $otHours 添加到此数组中。如果不清楚,请告诉我
  • 好的。肯定不清楚。我能够在表格底部计算工作时间和加班时间的最终总计,但我仍然不知道如何按每行显示总计。 (总工时 A&B 组),(总加班 A&B 组)
【解决方案2】:
$arr = array();
while($r = mysql_fetch_assoc($rec))
{
   $arr[] = $r;
}

if(count($arr) == 0){
echo 0;
}else{
//do something else
}

【讨论】:

    【解决方案3】:

    呼。最后,使用@LiangLiang Zheng 的回答,我可以获得最后的总计以及每行的工作时间和加班时间(行中)。 (说真的,我只知道基本的、简单的 PHP,并不真正知道如何使用数组等,所以我只编码我所知道的任何东西)。

    我现在唯一需要做的就是显示每列的总计: A 组总工时、A 组加班总小时、B 组总工时、B 组加班总小时。 (任何人都可以帮助我吗?)

    无论如何,这是我如何获得每行/行的总工作时间和总加班时间以及工作时间和加班时间的最终总计(显示在表格底部):

        <?php
    
        $total_workhours=0;
        $total_ot=0;
        // go through all possible combination of (dept, groups)
        foreach($allDepts as $deptId => $deptName) {
    
        $dept_workhour=0;
    $dept_ot=0;
    
        echo "<tr><td>$deptName</td>\n";
    
        foreach($allGroups as $group) 
    {
        $workHours = $results[$deptId][$group]['work'];
        printTd($workHours);
        $otHours = $results[$deptId][$group]['ot'];
        printTd($otHours);
    
        $total_workhours+=$workHours;
        $total_ot+=$ot_hour;
    
                $dept_workhour +=$workHours;
        $dept_ot +=$ot_hour;
    
        }
    
    echo "<td> $dept_workhour</td>\n";
    echo "<td>$dept_ot</td>\n";
        echo "</tr>\n";
        }
        ?>
        <tr align="center">
        <td>TOTAL</td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td ><?php echo $total_workhours; ?></td>
        <td><?php echo $total_ot; ?></td>
        </tr>
    
        <?php
        function printTd( $value ) {
        $value = $value ? $value:"empty";
        echo "<td>$value</td>\n";
        }
    

    【讨论】:

    • 1.这真的是对试图帮助你的人的侮辱。您应该只获取答案和大部分代码并创建自己的答案。
    • 2.如果您尝试回答自己的问题,至少要确保它是清晰和正确的。例如,“$ts_hour”到底是什么?
    • @LiangliangZheng,对不起,我确实放了“使用 LiangLiangZheng 的答案”。实际上,这是工作时间,而不是 ts_hour。对不起..我的错。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-31
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多