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

    Im ищет некоторую помощь для запуска этого запроса за каждый месяц.Выполнение 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']; 
    } 
    

    Таким образом, я получаю Общий доход января. Есть ли способ сделать цикл, поэтому он запускает запрос для каждого месяца в этом году?

    Так я не должен делать это таким глупым способом:

    $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

    +0

    Без проблем :) Спасибо –

    +0

    Возможно ли выполнить запрос 12 раз, даже если данные за 4-12 месяца пусты? Итак, это должности 0 вместо нулевого Я использую его для сравнения с некоторым прогнозом – nielskildsgaard

    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

    Это не будет содержать никаких данных за декабрь –

    +0

    @BrendanBullen oops. * копия-вставка * предмет. исправлено. –

    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])"; 
    
    Смежные вопросы