Автоинкремент с Group BY

0

У меня две таблицы:

контракт

Изображение 174551 |

Contractuser

Изображение 174551

Моя задача состояла в том, чтобы получить самую последнюю дату счета за каждый номер контракта из таблицы Contractuser и отобразить результаты. Итоговая таблица была следующей:

Таблица результатов

Изображение 174551

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

Я использовал для этого следующий запрос:

SELECT @i:=@i+1 AS Sno,a.ContractNo,a.SoftwareName,a.CompanyName,b.InvoiceNo,b.InvoiceDate,
b.InvAmount,b.InvoicePF,max(b.InvoicePT) AS InvoicePeriodTo,b.InvoiceRD,b.ISD
     FROM contract as a,contractuser as b,(SELECT @i:=0) AS i
     WHERE a.ContractNo=b.ContractNo
     GROUP BY b.ContractNo
     ORDER BY a.SoftwareName ASC;

Но кажется, что автоматическое приращение выполняется перед группой по процедуре, из-за которой серийные номера становятся отображаемыми непересекающимся образом.

  • 0
    Вы не можете получить эту работу, так как она оценивает переменную для каждой строки. Что вам нужно, это подзапрос для обработки группировки, а затем присоединить приращение к результатам.
  • 0
    Для дальнейшего использования всегда лучше предоставлять данные в текстовом формате, так как их легче скопировать / вставить, если кто-то захочет попробовать и скопировать ваши исходные данные / результаты.
Показать ещё 1 комментарий
Теги:
group-by
auto-increment

1 ответ

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

GROUP BY и переменные не обязательно работают должным образом. Просто используйте подзапрос:

SELECT (@i := @i + 1) AS Sno, c.*
FROM (SELECT c.ContractNo, c.SoftwareName, c.CompanyName, cu.InvoiceNo, cu.InvoiceDate,
             cu.InvAmount, cu.InvoicePF, max(cu.InvoicePT) AS InvoicePeriodTo, cu.InvoiceRD, cu.ISD
      FROM contract c JOIN
           contractuser as b
           ON c.ContractNo = cu.ContractNo
      GROUP BY cu.ContractNo
      ORDER BY c.SoftwareName ASC
     ) c CROSS JOIN
     (SELECT @i := 0) params;

Заметки:

  • Я также исправил синтаксис JOIN. Никогда не используйте запятые в предложении FROM.
  • Я также добавил разумные табличные псевдонимы - сокращения для таблиц. a и b ничего не значат, поэтому они затрудняют выполнение запроса.
  • Я оставил GROUP BY только одним ключом. Он должен действительно иметь все неагрегативные ключи, но это разрешено при некоторых обстоятельствах.
  • 0
    Я просто удалил SELECT @i: = @ i + 1 в предложении FROM, и запрос работал как чудо. Большое спасибо за помощь

Ещё вопросы

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