当前位置: 首页 > 知识库问答 >
问题:

MySQL帮助连接表以创建jasper iReport

申高卓
2023-03-14

让我先说我不是一个sql专家或jasper-报告专家,但我试图生成一个报告,显示谁登录了我的项目,按公司和客户每月。我还知道,我正在设计查询,以查看未来1个月,这样我就有html" target="_blank">数据来处理一个公司注册创建一个客户端或2个客户端,然后不登录或做任何事情的机会。

这就是我希望返回的数据的样子:

 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

我有这个查询,它将返回日期、公司名称、客户端名称、客户端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;

这将返回类似这样的内容,因为一些客户端在5月份没有登录,6月份也没有记录,基本上没有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;

这给了我一个表,其中包含日期、公司名称、客户名称和客户ID,而没有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 报表设计器 ireport。我正在使用这些数据创建一个交叉表,其中日期在顶部,客户端在左侧,并将身份验证放在交叉行中。

从大学年前开始,我就没有接触过sql。任何想法或指导将不胜感激。

共有1个答案

艾自强
2023-03-14

我已经从你的最后一个查询工作的方式,这似乎是生产你需要的:

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;

当然,这是一个简化版本,没有考虑到请求类型和状态,但我认为您可以从这里轻松完成。

 类似资料:
  • 如何创建将不同列与不同表合并的视图?例如,我有三个表:用户、物品和礼物(在本例中,这是一个用户可以向另一个用户赠送礼物的系统) < code>users表包含有关用户的信息,< code>items表包含有关项目的信息,< code>gifts表显示哪个用户向哪个用户发送了什么礼物。 我想要的是创建如下视图:

  • 我的轨道环境是 轨道: 3.2.14, 红宝石: 1.9.3, 系统:ubuntu mysql:5.5.32-0ubuntu0.12.04.1 我创建了一个mysql数据库,为了测试这个数据库,我从我在windows中的mysql workbench连接它。所以,我想展示一下,我在ubuntu中的mysql数据库运行正常 但是,当我在浏览器中运行网站时,我得到错误:active record::c

  • 问题内容: 我想从t1中获取名称,并在t2中获得与ID在t1上相同的行数。 到目前为止,我已经掌握了上述内容,但是如果t2中没有匹配的行,它将不会返回任何数据。如果没有行,则我希望将其设置为0(或NULL),并且名称仍然返回。 编辑: 我希望能够按降序排序。(或ASC)可行吗? 问题答案: 这应该为您工作: 左联接确保您拥有t1中的所有行,而COUNT(。)使其仅计算t2.id不为null的记录(

  • 如何创建合并来自两个不同表的不同所有列的视图。 这给了我一个错误: 重复的列名“tID” 有没有一种方法可以连接两个表,而不需要列出所有要选择的值?

  • 通过使用网络管理员配置并提供的配置文件,可以使用连接管理器连接到远程网络。连接所需的大多数配置包含在配置文件中;您需要提供网络凭据。

  • 当然,希望有人能帮助我创建外部配置单元分区表,方法是根据HDFS目录中的逗号分隔文件自动添加数据。我的理解(或缺乏理解)是,当您定义一个已分区的CREATE外部表并为其提供一个位置时,它应该递归地扫描/读取每个子目录,并将数据加载到新创建的已分区的外部表中。下面的内容应该会对我的烦恼提供一些更多的了解… 每个'dt='子目录都包含分隔的文件。