Запуск 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'];

    }

person nielskildsgaard    schedule 22.03.2013    source источник


Ответы (3)


Вам нужно использовать 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])";
person Brendan Bullen    schedule 22.03.2013
comment
Можно ли выполнить запрос 12 раз, даже если данные за месяц 4-12 пусты? Таким образом, он публикует 0 вместо нуля. Я использую его для сравнения с некоторым прогнозом. - person nielskildsgaard; 22.03.2013
comment
@nielskildsgaard Если я правильно вас понял, вы хотите получить 0 в результате для будущих дат, а не значения NULL? Я обновил ответ, чтобы использовать COALESCE. Это работает для вас? - person Brendan Bullen; 22.03.2013
comment
Прямо сейчас он просто заменяет данные, которые у меня есть, на 0 :) Поэтому я попытался с COALESCE (SUM (Income), 0) - person nielskildsgaard; 22.03.2013
comment
Но дело в том, что он не публикует NULL, он просто прекращает публиковать после того, как был запрошен месяц 1-3. - person nielskildsgaard; 22.03.2013
comment
Я буду честен и скажу, что не уверен на 100% в решении, но попробуйте здесь для аналогичной проблемы: stackoverflow.com/questions/12129611/ - person Brendan Bullen; 22.03.2013

Если я правильно вас понял, вы пытаетесь получить СУММУ (доход) по месяцам и годам?

И ваше поле: 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])";
person André Catita    schedule 22.03.2013

Вы можете сгруппировать записи по месяцам, но вам нужно использовать 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
person John Woo    schedule 22.03.2013
comment
Это не будет включать данные за декабрь. - person Brendan Bullen; 22.03.2013
comment
@BrendanBullen ой. копировать-вставить вещь. исправлено. - person John Woo; 22.03.2013