0

誰かが助けてくれることを願っています 私は毎日の売上のテーブルを作成しようとしており、各営業担当者が毎週の毎日の結果を確認できるテーブルを表示しようとしています。それほど難しいことではないと確信していますが、これについて頭を悩ませてきました.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>";

このコードから、結果は近いものになりますが、各ユーザーがテーブルに 1 回だけ表示されるようにフラット化したいと考えています。

-------------------------------------------------
|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 | 
-------------------------------------------------

ヘルプや提案をいただければ幸いです。

4

2 に答える 2

3

結果に注目しているようですPIVOT。これは以下を使用SUMして動作するはずCASEです:

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
于 2013-07-14T04:54:33.133 に答える
0

他の答えはここで良いです。実装する必要があると思いますが、これが大きなデータセットである場合、または何らかの並べ替えが必要な場合は、何らかのスケジュールされたプロセスを実行して自動的に実行することをさらにお勧めしますパフォーマンスの。

あなたがしていることは、レポート目的ですべてのデータの非正規化されたコピーを保存するための非常に明確なケースです。

あなたにとっては、ここで必要な出力とまったく同じテーブルを作成するのと同じくらい簡単かもしれません。そのためSelect *、ピボットする代わりに、そのテーブルに対してある種のクエリを実行するだけで済みます。ニーズはさまざまですが、パフォーマンスの問題が発生した場合は、それを検討する必要があります。

于 2013-07-14T04:59:21.280 に答える