Я пытаюсь сделать слишком много, может быть, в одном выражении SQL. Я бы хотел получить итоговые суммы и общее количество в соответствующих местах в выходной таблице. Это мой SQL;
SELECT Date, DOW, Week, Year, logdate, Month, monum, netID, Logins,
creds, newb, netCnt, TOD, netCnt, activity
FROM (SELECT logdate
,activity
,DATE( logdate ) AS Date
,DAYOFWEEK( logdate ) AS DOW
,WEEK( logdate,0 ) AS Week
,YEAR( logdate ) AS Year
,DATE_FORMAT( logdate, '%M' ) AS Month
,DATE_FORMAT( logdate, '%m' ) AS monum
,CONVERT( netID,UNSIGNED INTEGER ) AS netID
,COUNT( callsign ) AS Logins
,COUNT( IF(creds <> '',1,NULL) ) AS creds
,COUNT( IF(comments LIKE '%first log in%',1,NULL) ) AS newb
,count( DISTINCT netID ) AS netCnt
,SUM( DISTINCT netID) AS allCnt
,SEC_TO_TIME( SUM(timeonduty) ) AS TOD
FROM NetLog
WHERE netID <> 0
AND activity NOT LIKE '%TEST%'
AND netcall LIKE '%W0KCN%'
AND substr(logdate,1,4) = 2017
GROUP BY Month, netID WITH ROLLUP ) AS t
ORDER BY t.logdate , logins
Результат (сокращенный) выглядит так:
Вы заметите, что каждый месяц заказывается правильно, пока вы не доберетесь до октября. Большая сумма сортируется до октября, а не заканчивается (после декабря). Это что-то, что я могу контролировать в SQL, или я должен исправить это на PHP? Как я могу исправить это в SQL?
Оказывается, мне нужен оператор CASE, чтобы заставить это работать.
SELECT Date, DOW, Week, Year, Month, monum, netID, Logins,
creds, newb, netCnt, TOD, activity, logdate,
COALESCE (Month, 'GT') as MonthNM
FROM (SELECT logdate
,activity
,DATE( logdate ) AS Date
,DAYOFWEEK( logdate ) AS DOW
,WEEK( logdate,0 ) AS Week
,YEAR( logdate ) AS Year
,MONTHNAME ( logdate ) AS Month
,MONTH( logdate ) AS monum
,CONVERT( netID,UNSIGNED INTEGER ) AS netID
,COUNT( callsign ) AS Logins
,COUNT( IF(creds <> '',1,NULL) ) AS creds
,COUNT( IF(comments LIKE '%first log in%',1,NULL) ) AS newb
,count( DISTINCT netID ) AS netCnt
,SUM( DISTINCT netID) AS allCnt
,SEC_TO_TIME( SUM(timeonduty) ) AS TOD
FROM NetLog
WHERE netID <> 0
AND activity NOT LIKE '%TEST%'
AND netcall LIKE '%W0KCN%'
AND substr(logdate,1,4) = 2017
GROUP BY Month, netID WITH ROLLUP ) AS t
ORDER BY
CASE
WHEN MonthNM = 'GT' THEN 1
ELSE 0
END
,monum
,logins
Ваши logins
второго поля будут отсортированы соответственно только в равных значениях отсортированного столбца. В противном случае, приоритет сортировки в первом столбце. Попробуйте заменить logdate
и logins
и посмотреть, что произойдет.