Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > SELECT, как разбить результат на несколько ст.?


Автор: Unknown_Error 29.4.2006, 17:17
Hi everybody!  smile 
Имеется таблица вида:
Код

0) id|class|value
---------------------
1) 01|00001|2
2) 02|00002|3
3) 03|00001|1
4) 02|00002|2
5) 01|00002|4
6) 01|00001|4

Результат должен быть следующим:
Код

0) id|SUM(00001)|SUM(00002)|SUM
-----------------------------------
1) 01|00006|00004|00010
2) 02|00000|00005|00005
3) 03|00001|00000|00001

Здесь должна быть группировка по id и должна выводиться сумма по 00001 классу и по 00002 классу на каждый id.
В последнем столбце должна выводиться сумма по первым 2-м столбцам.
Пытался сделать, что-то подобное:
Код

SELECT id, SUM(...), SUM(...) FROM MYTABLE WHERE ... GROUP BY id ORDER BY id;

Who knows?  smile  

Автор: AntonioBanderaz 1.5.2006, 12:13
Код

CREATE TABLE #tmp (
  id INT(11),
  sum01 INT(11),
  sum02 INT(11),
  summ INT(11)
) ENGINE=MyISAM

CREATE PROCEDURE SUMDemo()
BEGIN
  DECLARE done INT DEFAULT 0;
  DECLARE id INT;
  DECLARE SUM01, SUM02 INT;
  DECLARE cur1 CURSOR FOR SELECT id FROM test.mytable GROUP BY id;
  DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
  
  OPEN cur1;
  REPEAT
    FETCH cur1 INTO id;
    IF NOT done THEN
       SELECT SUM(value) INTO SUM01 FROM test.mytable A WHERE A.class = 00001 AND A.id = id;
       SELECT SUM(value) INTO SUM02 FROM test.mytable A WHERE A.class = 00002 AND A.id = id;
       INSERT INTO #tmp(id, sum01, sum02, summ) VALUES(id, SUM01, SUM02, SUM01 + SUM02);
    END IF;
  UNTIL done END REPEAT;
  CLOSE cur1;
  SET @tmp = SELECT * FROM #tmp;
  TRUNCATE #tmp;
END


Вот как-то так это будет для 5.... На самом деле мож где-то ошибся... ))) 
как это использовать.
Код

CALL SUMDemo()
SELECT @tmp


ЗЫ. Это не самый лучший вариант... но как вариант мона использовать...  

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)