【问题标题】:Calculate total number of entries per state for a range of dates in php and mysql计算 php 和 mysql 中某个日期范围内每个状态的条目总数
【发布时间】:2013-12-14 17:15:48
【问题描述】:

我的数据库中有不同州根据日期注册的用户。

问:我想建立一个表格,显示每个州在一个日期范围内注册的总用户数,并按列和行合计。这可能吗?类似于下面这张表

    2013-10-01    2013-10-02    2013-10-03    2013-10-04    2013-10-05    TOTAL

NY:   125            110          102           98            75           510
MN:   21              56           78           41            22           218
CO:   17              41           52           51            56           217
TX:   10             102           45           62            21           240
NO:   59              85           78           48            98           368

TOTAL 232            394          355           300           272         1553 

我一直在处理以下查询

if ($_GET) {
$dateF = date('Y-m-d', strtotime($_GET['datefrom']));
$dateT = date('Y-m-d', strtotime($_GET['dateto']));

$db = new PDO('mysql:host=localhost;dbname=database;charset=utf8', 'username', 'pass');

$stmt = $db->query("
    SELECT   `Date`, COUNT(*) AS `count_num`
    FROM     `table`
    WHERE    `Date` BETWEEN '$dateF' AND '$dateT'
    GROUP BY `Date`
    ORDER BY `Date` ASC
");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
        echo "<tr>
                <td>" . $row["Date"] . "</td>
                <td>" . $row["count_num"] . "</td>

              </tr>";
        }

上面的查询只给了我每个日期的数据,但是所有的州都结合在一起。像这样的

Date         Total
2013-10-01    564
2013-10-02    124
2013-10-03    521 
etc..

我也尝试过处理以下查询

$stmt = $db->query("SELECT state, COUNT(*) cnt1 FROM `table` WHERE Date between '$datefrom' AND '$dateto' GROUP BY state;");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo "<tr>
   <td>" . $row["state"] . ":</td>
   <td>" . $row["cnt"] . "</td>
 </tr>";

}

但这仅显示输入日期范围内每个州的总数据。像这样的

NY: 125
MN: 21
CO: 17
TX: 10
NO: 59

非常感谢任何帮助。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    你需要一个叫做pivot query的东西。

    一个简单的例子 --> http://www.sqlfiddle.com/#!2/6fc8b/1

    SELECT state,
           SUM( if( date='2013-10-01', 1, 0) ) `2013-10-01`,
           SUM( if( date='2013-10-02', 1, 0) ) `2013-10-02`, 
           SUM( if( date='2013-10-03', 1, 0) ) `2013-10-03`
           --  .........   
           --  .........  
           --  .........  
    FROM `table`
    GROUP BY state;
    
    | STATE | 2013-10-01 | 2013-10-02 | 2013-10-03 |
    |-------|------------|------------|------------|
    |    CO |          4 |          2 |          3 |
    |    NY |          3 |          1 |          0 |
    |    TX |          1 |          0 |          4 |
    
    
    SELECT `date`,
           SUM( CASE state WHEN 'NY' THEN 1 ELSE 0 END ) `NY`,
           SUM( CASE state WHEN 'CO' THEN 1 ELSE 0 END ) `CO`,
           SUM( CASE state WHEN 'TX' THEN 1 ELSE 0 END ) `TX`
           --  .........  
           --  .........  
           --  .........  
    FROM `table`
    GROUP BY `date`
    
    |                           DATE | NY | CO | TX |
    |--------------------------------|----|----|----|
    | October, 01 2013 00:00:00+0000 |  3 |  4 |  1 |
    | October, 02 2013 00:00:00+0000 |  1 |  2 |  0 |
    | October, 03 2013 00:00:00+0000 |  0 |  3 |  4 |
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 1970-01-01
      • 2012-06-25
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 1970-01-01
      相关资源
      最近更新 更多