2016-05-17 73 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 

我有這樣的查詢將返回日期,公司名稱,客戶名稱,客戶端ID,auths中和獨特的用戶幾個月來的行動發生在這個查詢中,留下沒有認證的行。

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數據的日期,公司名稱,客戶端名稱和客戶端ID的表。

此表是這樣的:

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

我從你最後一次查詢的工作我的方式,這似乎是製造你所需要的:

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