2016-05-17 3 views
0

Позвольте мне начать с того, что я не эксперт по sql или эксперт из jasper-reports, но я пытаюсь создать отчет, который показывает, кто вошел в мой проект компанией и клиент в месяц. Я также знаю, что я разрабатываю запрос, чтобы посмотреть 1 месяц в будущем, так что у меня есть данные, чтобы справиться с тем, что компания подписывает создание клиента или 2, а затем ничего не регистрирует и не делает.MySQL Помогите соединить таблицы, чтобы сделать jasper ireport

Это то, что я хочу, возвращаемые данные выглядеть следующим образом:

Date  Company Client Client_ID  Authentications Unique_Users 
2016-may Company-A client-1  1    24     1 
2016-may Company-A client-2  2    10     2 
2016-may Company-A client-3  3    0     0 
2016-June Company-A client-1  1    0     0 
2016-June Company-A client-2  2    0     0 
2016-June Company-A client-3  3    0     0 

У меня есть этот запрос, который будет возвращать дата, название компании, имя клиента, идентификатор клиента, Авт и уникальных пользователей в течение нескольких месяцев, что действия произошел. Этот запрос не содержит строк, которые не имеют аутентификации.

SELECT 
    DATE_FORMAT(rq.requestTime, '%Y-%M') AS Date, 
    company.name AS Company, 
    client.name AS Client, 
    client.id AS client_id, 
    COUNT(rq.id) AS Authentications, 
    COUNT(DISTINCT rq.personguid) AS Unique_Users   
FROM 
company JOIN CLIENT ON company.id = client.company_id 
    LEFT JOIN request_queue rq ON rq.clientid = client.id 
WHERE 
company.id = 19 
AND rq.status = 'complete' AND rq.request_type LIKE "%authorize%" 
    AND MONTH(rq.requestTime) >= MONTH("2016-05-01") 
    AND MONTH(rq.requestTime) <= MONTH("2016-06-01") 
GROUP BY 
    client_id, Date 
ORDER BY Date ASC, client_id ASC; 

Это возвращает что-то вроде этого, потому что некоторые клиенты не вошли в систему в мае и июне не имеет записей все же, в основном отсутствуют данные request_queue нет строк:

Date  Company Client Client_ID  Authentications Unique_Users 
2016-may Company-A client-1  1    24     1 
2016-may Company-A client-2  2    10     2 

В этот момент я придумал это.

SELECT 
dateTable.mydate AS Date, 
clientTable.ClientName AS Client, 
clientTable.CompanyName AS Company, 
clientTable.client_id AS Client_ID 
FROM 
(SELECT 
client.name AS ClientName, 
client.id AS client_id, 
company.name AS CompanyName 
FROM 
company JOIN CLIENT ON company.id = client.company_id 
WHERE company.id = 19) clientTable 
JOIN 
(SELECT 
DATE_FORMAT(temp.thedate,'%Y-%M') AS mydate, 
temp.thedate AS theDate FROM (
     SELECT 
    DATE_ADD("2016-05-01", INTERVAL u.i MONTH) AS thedate 
     FROM i AS u ORDER BY thedate) temp 
     WHERE temp.thedate <= "2016-06-01") dateTable; 

Это дает мне таблицу, которая имеет даты, названия компаний, имена клиентов, и клиентские идентификаторы без данных request_queue.

Эта таблица выглядит следующим образом:

Date  Company Client Client_ID 
2016-may Company-A client-1  1 
2016-may Company-A client-2  2 
2016-may Company-A client-3  3 
2016-June Company-A client-1  1 
2016-June Company-A client-2  2 
2016-June Company-A client-3  3 

Есть ли способ, чтобы объединить эти данные, чтобы получить диаграмму, расположенную в верхней части этого поста?

Дополнительная информация: Целью является передать результаты моего запроса дизайнеру-дизайнеру отчета jasper. Я использую данные для создания кросс-таблицы с датами по вершине и клиентами с левой стороны и помещением аутентификации в перекрестные строки.

Я не касался sql, так как колледж лет назад. Любые мысли или рекомендации будут оценены.

ответ

1

Я работал мой путь от последнего запроса, и это, кажется, производит то, что вам нужно:

SELECT 
    dateTable.mydate AS Date, 
    clientTable.ClientName AS Client, 
    clientTable.CompanyName AS Company, 
    clientTable.client_id AS Client_ID, 
    COUNT(rq.id) AS Authentications, 
    COUNT(DISTINCT rq.personguid) AS Unique_Users 
FROM 
(SELECT 
    client.name AS ClientName, 
    client.id AS client_id, 
    company.name AS CompanyName 
    FROM company JOIN CLIENT ON company.id = client.company_id 
    WHERE company.id = 19) clientTable 
JOIN (SELECT 
    DATE_FORMAT(temp.thedate,'%Y-%M') AS mydate, 
    temp.thedate AS theDate 
    FROM (SELECT 
      DATE_ADD("2016-05-01", INTERVAL u.i MONTH) AS thedate 
      FROM i AS u ORDER BY thedate) temp 
      WHERE temp.thedate <= "2016-06-01") dateTable 
LEFT JOIN request_queue rq on (rq.clientid = clientTable.client_ID and DATE_FORMAT(rq.requestTime,'%Y-%M') = dateTable.mydate) 
GROUP BY Client_ID, Date 
ORDER BY Date ASC, Client_ID ASC; 

Конечно, это упрощенная версия, которая не принимает во внимание тип запроса и состояния , но я думаю, что вы можете легко с этим справиться.

+0

Спасибо, это работает отлично. Я работаю над этим всю ночь. Игра с профсоюзами, объединениями и группами и просто не могли понять. – ChoklatStu

Смежные вопросы