Как мне выполнить несколько запросов mysql в отчетах Jasper (не то, что вы думаете …)

#jasper-reports #rank #infobright

#jasper-отчеты #ранг #infobright

Вопрос:

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

 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, а затем скомпилировал свой отчет. После его выполнения я получаю синтаксические ошибки. Поэтому я подумал, что, возможно, ; сбрасывал это. Итак, в верхней части запроса я вставил РАЗДЕЛИТЕЛЬ ;. Это тоже не сработало.

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

Ответ №1:

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)

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

Комментарии:

1. Спасибо за ответ, но это не совсем то, что я ищу. Это отлично работает с MySQL, но без использования движка brighthouse (Infobright). Для всех элементов в brighthouse ранг будет отображаться как 1.

2. Вы это тестировали?, потому что тогда на выходе должны быть все 0, а не 1.

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

4. Изменен ответ, чтобы отразить специфику infobright, почему для infobright нет тега?

5. Однако я попытался пометить его infobright; там говорилось, что у меня должно быть 1500 очков репутации, прежде чем создавать свой собственный тег. Странно, что это никогда не создавалось раньше.

Ответ №2:

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