2016-03-17 2 views
0

Я делаю отчет о продажах с помощью PHP. Дата и время транзакции указаны в столбце LastUpdateTime с форматом: m-d-Y H:i:s. Теперь я хочу сделать отчет за 1 неделю, поэтому мне нужна сумма TotalAmount всей транзакции за 1 день, поэтому я использую группу по DAY из LastUpdateTime. Вот мой код, но он не работает:GROUP BY day of Datetime SQL

<?php 
include 'report/go.php'; //DB connect 
            $today =time(); 
            $from_time = date('d-m-Y', strtotime('last Monday')); 
            $to_time = date('d-m-Y', strtotime('next Monday - 1 MIN')); 
    $sql = "SELECT 
      SUM(TotalAmount) AS TotalPerDay , LastUpdateTime, DATEPART(dd,LastUpdateTime) 
      FROM Tickets 
      WHERE LastUpdateTime BETWEEN '$from_time' and '$to_time' 
      GROUP BY DATEPART(dd,LastUpdateTime) 
      "; 
    $stmt = sqlsrv_query($conn, $sql); 
     if($stmt === false) 
      { 
       die(print_r(sqlsrv_errors(), true)); 
      } 
     while($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) 
      { 
       $money = $row['TotalPerDay']; 
       $date = date_format($row['LastUpdateTime'], "d-m-Y"); 
       echo $money." - ".$date."<br>"; 
      } 
?> 

Возвращена ошибка:

Колонка «Tickets.LastUpdateTime» недопустим в списке выбора, поскольку он не содержится ни в статистической функции или Группового пунктом

Пожалуйста, помогите :) Спасибо большое :)

+0

Поместите 'LastUpdateTime' в' Group By'? – Matt

+0

Это либо должно быть в виде агрегатной функции, например. 'SUM/count/min/max' или в' group by' – Matt

+0

Я просто хочу Group By DATE of LastUpdateTime. потому что я ищу общий доход каждый день. –

ответ

1

Либо вы используете ..

SELECT  SUM(TotalAmount) AS TotalPerDay , DATEPART(dd,LastUpdateTime) 
FROM  Tickets 
WHERE  LastUpdateTime BETWEEN '$from_time' and '$to_time' 
GROUP BY DATEPART(dd,LastUpdateTime) 

ИЛИ

SELECT  SUM(TotalAmount) AS TotalPerDay , DATEPART(dd,LastUpdateTime), LastUpdateTime 
FROM  Tickets 
WHERE  LastUpdateTime BETWEEN '$from_time' and '$to_time' 
GROUP BY LastUpdateTime 

Потому что вы не можете выбрать столбец/вычисленный результат в группе выберите заявление, если оно не является частью группы по п

Если вы хотите, чтобы ваш запрос выполнил тогда, ссылка может помочь вам

Efficiently Include Column not in Group By of SQL Query

Select a Column in SQL not in Group By

+0

Спасибо, но оба ваших решения не работали. Появится еще одна ошибка: «Преобразование типа данных varchar в тип данных datetime приводит к значению вне диапазона» –

+0

Так что кажется, что тип данных столбца LastUpdateTime является varchar .. правильно? – Moumit

2

Таким образом, вы используете lastUpdateTime и DATEPART(dd,LastUpdateTime) в запросе выборки, которые отличаются. Таким образом, для более чем 1 lastUpdateTime, вы можете иметь одинаковые DATEPART(dd,LastUpdateTime). Поэтому, если вы группируете DATEPART(dd,LastUpdateTime), тогда ваша база данных не будет знать, какой из lastUpdateTime следует вернуть с ней.

Таким образом, либо используйте max(lastUpdateTime), либо любую другую агрегированную функцию в выбранном запросе.

SELECT 
     SUM(TotalAmount) AS TotalPerDay 
     ,max(LastUpdateTime) 
     ,DATEPART(dd,LastUpdateTime) 
     FROM Tickets 
     WHERE LastUpdateTime BETWEEN '$from_time' and '$to_time' 
     GROUP BY DATEPART(dd,LastUpdateTime), 
     LastUpdateTime 

Или добавить lastUpdateTime к группе по статье, но это не даст вам ожидаемого результата.

0

Спасибо всем, я понял, мое решение

SELECT SUM(TotalAmount) AS TotalPerDay , CONVERT(VARCHAR(10),LastUpdateTime,103) AS TicketDateTime FROM Tickets WHERE LastUpdateTime BETWEEN '$from_time' and '$to_time' GROUP BY CONVERT(VARCHAR(10),LastUpdateTime,103)

Я использовал CONVERT вместо DATEPART, то я до сих пор даты продажи, и до сих пор в состоянии GROUP BYTotalAmount

Спасибо всем так много