Перейти к содержимому

Реферальная программа Мегаплана

Партнерская программа Kredov

Привет нужен sql запрос, могу купить за деньги

#11 fedornabilkin

fedornabilkin
  • Пользователь
  • 696 сообщений
  • Репутация: 91
0

Отправлено 13 Август 2013 - 16:46

Тогда надо создать еще одно поле и писать туда флаг.
Например при создании новой запси, если предыдущая относится к этому же менеджеру, то помечать ее флагом из предыдущей записи.
Если предыдущая запись другого менеджера, то ставить другой флаг, а потом группировать по этим флагам.
1|200|x
1|300|x
2|150|y
1|250|z
1|350|z
2|500|w
2|500|w
  • 0
Как часто в горестной разлуке,В моей блуждающей судьбе, ФО, я думал о тебе.


#12 c0ns0l3

c0ns0l3
  • Пользователь
  • 264 сообщений
  • Репутация: 49

Отправлено 24 Сентябрь 2013 - 09:16

Ща напишем....
  • 0

#13 c0ns0l3

c0ns0l3
  • Пользователь
  • 264 сообщений
  • Репутация: 49

Отправлено 24 Сентябрь 2013 - 11:34

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

Рузультат: sql_test.jpg

Если ТС что-то и хотел заплатить за "это", то могу подсказать куда сбросить благотворительное пожертвование :)

Прошу...

1. Структура основной таблицы:
CREATE TABLE _test (
  idmanager int(11) NOT NULL,
  cost float NOT NULL,
  datetime datetime NOT NULL
)
ENGINE = MYISAM
CHARACTER SET cp1251
COLLATE cp1251_general_ci;

2.Структура временной таблицы:
CREATE TABLE _calculation (
  uID int(11) NOT NULL AUTO_INCREMENT,
  idmanager int(11) DEFAULT NULL,
  cost float DEFAULT NULL,
  curs int(11) DEFAULT NULL,
  PRIMARY KEY (uID)
)
ENGINE = MYISAM
CHARACTER SET cp1251
COLLATE cp1251_general_ci;

3. Создаем процедуру, которая сделает все что выше было описано в теории.... и вернет нам то, что требует ТС:
CREATE DEFINER = 'admin'@'%'
PROCEDURE _calc_cost()
BEGIN
  DECLARE done int DEFAULT 0;
  DECLARE _ManagerID int;
  DECLARE _ManagerCost FLOAT;
  #Переменная, по которой будет потом производится группировка
  DECLARE _Cursor int DEFAULT 0;
  #Временный ID по которому будет сравнение
  DECLARE _TempID int DEFAULT 0;

  #Курсор, который будет перебираться по строчно
  DECLARE ManagerData CURSOR FOR SELECT idmanager, cost FROM _test;

  #Задача переменной определить конец перебора
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
  #Открытие курсора
  OPEN ManagerData;

  #Очистка временной таблицы
  TRUNCATE TABLE _calculation;

  #Цикл перебора
  WHILE NOT done DO
	  #Получаем данные из курсора и сохраняем их
	  FETCH ManagerData INTO _ManagerID,_ManagerCost;
	  #Условие не повторения подряд Номера Манагера
	  IF (_TempID != _ManagerID) THEN
		set _Cursor:= _Cursor + 1;
		set _TempID:= _ManagerID;
	  END IF;
	  #Сохраняем данные во временную таблицу
	  INSERT INTO _calculation (idmanager,cost,curs) VALUES (_ManagerID,_ManagerCost,_Cursor);

  END WHILE;

  #Закрываем Курсор для чтения
  CLOSE ManagerData;
  #Выводим данные из временной таблицы с групировкой
  #увы, не смог разобраться в этом глюке, но у меня отрабатывала
  #дважды последний луп из курсора, поэтому прийдется убрать
  #последнюю строку из этого запроса...
  SELECT idmanager, SUM(cost) AS cost FROM _calculation  WHERE uID NOT IN (SELECT MAX(uID)-1 FROM _calculation) GROUP BY curs;
  
  #Повторная очистка временной таблицы (после дебагов)
  TRUNCATE TABLE _calculation;

END

  • 1


Оформление форума – IPBSkins.ru