php
  • sql
  • sql-server
  • while-loop
  • 2013-03-22 81 views 1 likes 
    1

    我正在寻找一些帮助来运行这个查询每个月。每月运行一次SQL查询 - PHP

    $params = array(&$_POST['query']); 
    
    $SQL1 = "SELECT SUM(Income) AS OrderTotal 
    FROM SalesDB 
    WHERE 
    SalesDB.[Posting Date] <= '2013-01-01' AND 
    SalesDB.[Posting Date] >= '2013-01-31'"; 
    
    $options = array("Scrollable" => SQLSRV_CURSOR_KEYSET); 
    $getProducts1 = sqlsrv_query($conn, $SQL1, $params, $options); 
    if ($getProducts1 === false) 
    die(var_dump(sqlsrv_errors())); 
    
    while ($row = sqlsrv_fetch_array($getProducts1, SQLSRV_FETCH_ASSOC)) 
    { 
    $row['OrderTotal']; 
    } 
    

    以这种方式,我得到了1月份的总收入。有没有办法做一个循环,所以它在今年每个月都会运行一个查询?

    所以我没有做这样笨的办法:

    $params = array(&$_POST['query']); 
    
        $SQL1 = "SELECT SUM(Income) AS OrderTotal 
        FROM SalesDB 
        WHERE 
        SalesDB.[Posting Date] <= '2013-01-01' AND 
        SalesDB.[Posting Date] >= '2013-01-31'"; 
    
        $options = array("Scrollable" => SQLSRV_CURSOR_KEYSET); 
        $getProducts1 = sqlsrv_query($conn, $SQL1, $params, $options); 
        if ($getProducts1 === false) 
        die(var_dump(sqlsrv_errors())); 
    
    $SQL2 = "SELECT SUM(Income) AS OrderTotal 
        FROM SalesDB 
        WHERE 
        SalesDB.[Posting Date] <= '2013-02-01' AND 
        SalesDB.[Posting Date] >= '2013-02-28'"; 
    
        $options = array("Scrollable" => SQLSRV_CURSOR_KEYSET); 
        $getProducts2 = sqlsrv_query($conn, $SQL2, $params, $options); 
        if ($getProducts2 === false) 
        die(var_dump(sqlsrv_errors())); 
    
        while ($row1 = sqlsrv_fetch_array($getProducts1, SQLSRV_FETCH_ASSOC) AND $row2 = sqlsrv_fetch_array($getProducts2, SQLSRV_FETCH_ASSOC)) 
        { 
        echo $row1['OrderTotal']; 
    echo $row2['OrderTotal']; 
    
        } 
    
    +0

    什么问题了吗? – 2013-03-22 09:52:24

    回答

    2

    您需要使用GROUP BY。此查询将得到所有的收入总和为2013,按照日期顺序:

    $params = array(&$_POST['query']); 
    
    $SQL1 = "SELECT SUM(Income) AS OrderTotal 
    FROM SalesDB 
    WHERE 
    YEAR(SalesDB.[Posting Date]) = '2013' 
    GROUP BY MONTH(SalesDB.[Posting Date]) 
    ORDER BY MONTH(SalesDB.[Posting Date])"; 
    
    $options = array("Scrollable" => SQLSRV_CURSOR_KEYSET); 
    $getProducts = sqlsrv_query($conn, $SQL1, $params, $options); 
    if ($getProducts === false) 
    die(var_dump(sqlsrv_errors())); 
    
    while ($row = sqlsrv_fetch_array($getProducts, SQLSRV_FETCH_ASSOC)) 
    { 
        echo $row['OrderTotal']; 
    } 
    

    要显示0而不是NULL的日期没有任何数据,则可以COALESCE结果:

    $SQL1 = "SELECT COALESCE(0,SUM(Income)) AS OrderTotal 
         FROM SalesDB 
         WHERE YEAR(SalesDB.[Posting Date]) = '2013' 
         GROUP BY MONTH(SalesDB.[Posting Date]) 
         ORDER BY MONTH(SalesDB.[Posting Date])"; 
    
    +0

    这是做到了。谢谢! :)我可以接受在4分钟 – nielskildsgaard 2013-03-22 09:56:01

    +0

    没问题:)谢谢 – 2013-03-22 12:04:30

    +0

    即使月4-12的数据是空的,是否可以运行查询12次? 因此,它发布0而不是null 我使用它与某些预测进行比较 – nielskildsgaard 2013-03-22 12:47:57

    0

    您可以按个月的记录,但你需要为了得到日期的月份值使用MONTH()

    SELECT MONTH(SalesDB.[Posting Date]) MonthNo, 
         DATENAME(month, SalesDB.[Posting Date]) MonthName, 
         SUM(Income) OrderTotal 
    FROM SalesDB 
    WHERE SalesDB.[Posting Date] BETWEEN '2013-01-01' AND '2013-12-31' 
    GROUP BY MONTH(SalesDB.[Posting Date]), 
          DATENAME(month, SalesDB.[Posting Date]) 
    ORDER BY MonthNo ASC 
    
    +0

    这将不包括12月的任何数据 – 2013-03-22 09:51:55

    +0

    @BrendanBullen oops。 *复制粘贴*的东西。固定。 – 2013-03-22 09:52:47

    1

    如果我正确地理解了你,你正试图按月和年取得SUM(收入)?

    而你的领域是:SalesDB。[发布日期]?

    这是我会怎么做:

    $sql = "SELECT SUM(Income) AS OrderTotal, YEAR(alesDB.[Posting Date]) AS year, MONTH(alesDB.[Posting Date]) AS month 
    FROM SalesDB 
    GROUP BY YEAR(alesDB.[Posting Date]), MONTH(alesDB.[Posting Date])"; 
    
    相关问题