PHP MySQL每日结果表

时间:2013-07-14 04:49:38

标签: php mysql

希望有人可以帮助我尝试建立每日销售表,并显示一个表格,每个销售人员可以每周查看他们的每日结果。我确定它不是太难,但我一直在摸不着头脑,我刚接触到php和MySQL一直在寻找我的方式虽然没关系但是这已经让我

我想要实现的结果看起来像这样。

-------------------------------------------------
|Name | sun | mon | tue | wed | thu | fri | sat | 
-------------------------------------------------
|pete |  0  |  0  |  0  | 200 | 200 |  0  |  0  |
-------------------------------------------------
|mike |  0  |  0  |  0  |  0  | 100 |  0  | 100 |
-------------------------------------------------

我正在使用的表的一个例子是......

------------------------------------------------
| order_number | order_value | user_name | Date |
-------------------------------------------------
|    1         |     100     |   pete    | 10/7 |
-------------------------------------------------
|    2         |     200     |   mike    | 13/7 |
-------------------------------------------------
|    3         |     100     |   pete    | 10/7 |
-------------------------------------------------
|    4         |     100     |   mike    | 11/7 |
-------------------------------------------------
|    5         |     200     |   peter   | 11/7 |
-------------------------------------------------

目前我正在使用的代码如下 不确定我是否最好通过PHP代码或使用更好的SQL查询来操纵这些数据。

$sql = mysqli_query($mysqli," SELECT SUM(order_value) , DAYOFWEEK(Date) , `user_name` 
FROM  `my_table` 
WHERE WEEK(Date) = $thisweek -1 AND YEAR(Date) = $currentYear 
GROUP BY user_name , DAYOFWEEK(Date)");

echo "
<table border ='1'>
<tr><td>Name</td><td>sun</td><td>mon</td><td>tue</td><td>wed</td><td>thu</td><td>fri</td><td>sat</td></tr>";


while($result=mysqli_fetch_array($sql))
{
    $i = $result['DAYOFWEEK(Date)'];
    $v = $result['SUM(order_value)'];
    $n = $result['user_name'];  
    $d = $i;

    echo "<td>" . $n . "</td>";

for($d=1; $d<=7; $d++ )
{
    if($v >0 && $d == $i)
    {
        echo "<td>" . $v . "</td>";
    }
    else
    {
        echo "<td>0</td>";
    }
} 
    echo"</tr>";
}

    echo "</table>";

从这段代码中得到它的结果很接近,但我想让它变平,所以每个用户只在表格中出现一次,

-------------------------------------------------
|Name | sun | mon | tue | wed | thu | fri | sat | 
-------------------------------------------------
|pete |  0  |  0  |  0  | 200 |  0  |  0  |  0  |
-------------------------------------------------
|pete |  0  |  0  |  0  |  0  | 200 |  0  |  0  |
-------------------------------------------------
|mike |  0  |  0  |  0  |  0  | 100 |  0  |  0  |
-------------------------------------------------
|mike |  0  |  0  |  0  |  0  |  0  |  0  | 100 | 
-------------------------------------------------

任何帮助或建议都将不胜感激。

2 个答案:

答案 0 :(得分:3)

听起来你正在寻找PIVOT你的结果。这可以使用SUMCASE

一起使用
SELECT `user_name`,
    SUM(CASE WHEN DAYOFWEEK(Date) = 1 THEN order_value ELSE 0 END) Sun,
    SUM(CASE WHEN DAYOFWEEK(Date) = 2 THEN order_value ELSE 0 END) Mon,
    ...
    SUM(CASE WHEN DAYOFWEEK(Date) = 7 THEN order_value END) Sat  
FROM  `my_table` 
WHERE WEEK(Date) = $thisweek -1 AND YEAR(Date) = $currentYear 
GROUP BY user_name

答案 1 :(得分:0)

另一个答案很好,我认为你应该实现它,但我会进一步建议你运行某种预定的过程来自动为你做这个,如果这是一个大数据集,或者其他需要任何形式的表现。

您正在做的是一个非常明确的案例,用于存储所有数据的非规范化副本以用于报告目的。

对于您来说,它可能就像创建一个与此处所需的输出完全相同的表一样简单,因此您可以在其上执行Select *类型的查询而不是旋转。您的需求可能会有所不同,但如果您发现自己遇到性能问题,则应该考虑它。