MySQL 帮助连接表以制作 jasper ireport
MySQL Help joining tables to make a jasper ireport
首先声明我不是 sql 专家或 jasper-reports 专家,但我正在尝试生成一份报告,按公司和客户每月显示谁登录了我的项目.我也知道我正在设计查询以查看未来 1 个月,以便我有数据来处理 A 公司注册创建一个或 2 个客户然后不登录或不做任何事情的机会。
这就是我希望 returned 数据的样子:
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
我有这个查询,它将 return 日期、公司名称、客户名称、客户 ID、身份验证和发生操作的月份的唯一用户。这个查询遗漏了没有身份验证的行。
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;
这会return是这样的,因为有的客户五六月份还没有登录,还没有记录,基本上没有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;
这给了我一个 table,其中包含日期、公司名称、客户名称和客户 ID,但没有 request_queue 数据。
这个 table 看起来像这样:
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
有没有办法合并这些数据,使图表位于 post 的顶部?
附加信息:
目标是将我的查询结果传递给 jasper 报表设计器 ireport。我正在使用这些数据创建一个交叉表,日期在顶部,客户端在左侧,并将身份验证放在交叉行中。
自从上大学以来,我就没碰过 sql。任何想法或指导将不胜感激。
我按照你上次查询的方式工作,这似乎产生了你需要的东西:
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;
当然,这是没有考虑请求类型和状态的简化版本,但我认为您可以从这里轻松操作。
首先声明我不是 sql 专家或 jasper-reports 专家,但我正在尝试生成一份报告,按公司和客户每月显示谁登录了我的项目.我也知道我正在设计查询以查看未来 1 个月,以便我有数据来处理 A 公司注册创建一个或 2 个客户然后不登录或不做任何事情的机会。
这就是我希望 returned 数据的样子:
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
我有这个查询,它将 return 日期、公司名称、客户名称、客户 ID、身份验证和发生操作的月份的唯一用户。这个查询遗漏了没有身份验证的行。
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;
这会return是这样的,因为有的客户五六月份还没有登录,还没有记录,基本上没有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;
这给了我一个 table,其中包含日期、公司名称、客户名称和客户 ID,但没有 request_queue 数据。
这个 table 看起来像这样:
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
有没有办法合并这些数据,使图表位于 post 的顶部?
附加信息: 目标是将我的查询结果传递给 jasper 报表设计器 ireport。我正在使用这些数据创建一个交叉表,日期在顶部,客户端在左侧,并将身份验证放在交叉行中。
自从上大学以来,我就没碰过 sql。任何想法或指导将不胜感激。
我按照你上次查询的方式工作,这似乎产生了你需要的东西:
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;
当然,这是没有考虑请求类型和状态的简化版本,但我认为您可以从这里轻松操作。