Как выполнить несколько запросов MySQL в отчетах Jasper (не то, что вы думаете ...) - PullRequest
0 голосов
/ 14 апреля 2011

У меня сложный запрос, который требует ранга в нем. Я узнал, что стандартный способ сделать это - использовать технику, представленную на этой странице: http://thinkdiff.net/mysql/how-to-get-rank-using-mysql-query/. Я использую Infobright в качестве серверной части, и она работает не совсем так, как ожидалось. То есть, хотя стандартный движок MySQL будет показывать ранг как 1, 2, 3, 4 и т. Д. Brighthouse (движок Infobright) будет возвращать 1, 1, 1, 1 и т. Д. Итак, я придумал стратегия установки переменной, функции, а затем выполнить ее в запросе. Вот подтверждение концепции запроса, который делает именно это:

SET @rank = 0;

DROP FUNCTION IF EXISTS __GetRank;
DELIMITER $$
CREATE FUNCTION __GetRank() RETURNS INT
BEGIN
    SET @rank = @rank + 1;
    return @rank;
END$$

DELIMITER ;

select __GetRank() AS rank, id from accounts;

Затем я скопировал и вставил функцию в iReport Jasper Report, а затем скомпилировал свой отчет. После его выполнения я получаю синтаксические ошибки. Поэтому я подумал, что, возможно,; скинул это. Поэтому в верхней части запроса я добавляю DELIMITER; Это тоже не сработало.

Возможно ли то, что я хочу сделать? Если так, то как? И если есть Infobright способ получить звание без написания функции, я тоже буду к этому открыт.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2011

Вот как я это решил.Моя серверная программа выполняла скрипт mysql.Затем я взял вывод и преобразовал его в CSV.Затем я использовал это в качестве входных данных для моего отчета.Немного запутанный, но это работает.

0 голосов
/ 14 апреля 2011

Infobright не поддерживает функции. С сайта: http://www.infobright.org/forums/viewthread/1871/#7485

Действительно, IB поддерживает хранимые процедуры, но не поддерживает ни хранимые функции, ни определенные пользователем функции.

select if(@rank is null,@rank:= 0,@rank:= @rank +1) as rank, id from accounts

Не работает, потому что вы не можете писать в @vars в запросах.

Это:

 SELECT 
   (SELECT COUNT(*) 
    FROM mytable t1 
    WHERE t1.rankedcolumn > t2.rankedcolumn) AS rank, 
 t2.rankedcolumn
 FROM mytable t2 WHERE ...;  

будет работать, но очень медленно, конечно.

Отказ от ответственности , не мой код, а код Якуба Вроблевского (основателя Infobright)

Надеюсь, это поможет ...

...