MySQL ORDER BY проблемы

0

Я пытаюсь сделать слишком много, может быть, в одном выражении 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

Результат (сокращенный) выглядит так: Изображение 174551

Вы заметите, что каждый месяц заказывается правильно, пока вы не доберетесь до октября. Большая сумма сортируется до октября, а не заканчивается (после декабря). Это что-то, что я могу контролировать в SQL, или я должен исправить это на PHP? Как я могу исправить это в SQL?

Теги:
sql-order-by

2 ответа

0
Лучший ответ

Оказывается, мне нужен оператор 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
0

Ваши logins второго поля будут отсортированы соответственно только в равных значениях отсортированного столбца. В противном случае, приоритет сортировки в первом столбце. Попробуйте заменить logdate и logins и посмотреть, что произойдет.

  • 0
    Я не думаю, что понимаю, что вы имеете в виду, когда говорите «своп логдейт и логины». Куда мне их поменять?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню