簡體   English   中英

如何最好地組合多個選擇語句來創建報告的單個數據集

[英]how best to combine multiple select statements to create single dataset for report

我目前有 3 個選擇語句,用於提取白班、夜班和星期六的用戶登錄信息。 我想將所有這些組合成單個查詢/數據集,然后我可以使用它在我們的 BI 工具中提取單個報告/圖表。 單獨運行這些會給出我正確的輸出,但想要合並,然后可以生成每個疊加的報告/圖表。

任何幫助表示贊賞。

SELECT
  DATE(users_logins.login_time - INTERVAL 7 HOUR) AS Date,
  COUNT(DISTINCT users_logins.user_id) AS `Number of Unique Users DayShift`
FROM users_logins
WHERE TIME(users_logins.login_time - INTERVAL 7 HOUR) >= '04:00:00'
AND TIME(users_logins.login_time - INTERVAL 7 HOUR) < '16:30:00'
AND WEEKDAY(DATE(users_logins.login_time - INTERVAL 7 HOUR)) BETWEEN 0 AND 4
GROUP BY 1
ORDER BY Date DESC

SELECT
  DATE(users_logins.login_time - INTERVAL 7 HOUR) AS Date,
  COUNT(DISTINCT users_logins.user_id) AS `Number of Unique Users NightShift`
FROM users_logins
WHERE TIME(users_logins.login_time - INTERVAL 7 HOUR) >= '16:30:00'
AND TIME(users_logins.login_time - INTERVAL 7 HOUR) < '21:00:00'
AND WEEKDAY(DATE(users_logins.login_time - INTERVAL 7 HOUR)) BETWEEN 0 AND 4
GROUP BY 1
    ORDER BY Date DESC

SELECT
  DATE(users_logins.login_time - INTERVAL 7 HOUR) AS Date,
  COUNT(DISTINCT users_logins.user_id) AS `Number of Unique Users Saturday`
FROM users_logins
WHERE TIME(users_logins.login_time - INTERVAL 7 HOUR) >= '04:00:00'
AND TIME(users_logins.login_time - INTERVAL 7 HOUR) < '21:00:00'
AND WEEKDAY(DATE(users_logins.login_time - INTERVAL 7 HOUR)) = 5
GROUP BY 1
ORDER BY Date DESC

使用條件聚合。 這個想法是將條件移動到聚合表達式內。 我還建議在子查詢中偏移日期,因此無需在查詢中重復表達式。

所以:

SELECT
    DATE(login_time) AS Date,
    COUNT(DISTINCT  
        CASE WHEN TIME(login_time) >= '04:00:00' 
              AND TIME(login_time) <  '16:30:00'  
              AND WEEKDAY(DATE(login_time)) BETWEEN 0 AND 4
        THEN user_id
        END
    ) AS `Number of Unique Users DayShift`,
    COUNT(DISTINCT  
        CASE WHEN TIME(login_time) >= '16:30:00' 
              AND TIME(login_time) <  '21:00:00'  
              AND WEEKDAY(DATE(login_time)) BETWEEN 0 AND 4
        THEN user_id
        END
    ) AS `Number of Unique Users NightShift`,
    COUNT(DISTINCT  
        CASE WHEN TIME(login_time) >= '04:00:00' 
              AND TIME(login_time) <  '21:00:00' 
              AND WEEKDAY(DATE(login_time)) = 5           
        THEN user_id
        END
    ) AS `Number of Unique Users DayShift`
FROM (SELECT login_time - INTERVAL 7 HOUR login_time, user_id FROM users_logins) u
GROUP BY 1
ORDER BY Date DESC

您可以為此使用 UNION ,我相信您需要將 ORDER BY 放在最后而不是每個 SELECT :

SELECT
  DATE(users_logins.login_time - INTERVAL 7 HOUR) AS Date,
  COUNT(DISTINCT users_logins.user_id) AS `Number of Unique Users DayShift`
FROM users_logins
WHERE TIME(users_logins.login_time - INTERVAL 7 HOUR) >= '04:00:00'
AND TIME(users_logins.login_time - INTERVAL 7 HOUR) < '16:30:00'
AND WEEKDAY(DATE(users_logins.login_time - INTERVAL 7 HOUR)) BETWEEN 0 AND 4
GROUP BY 1

UNION

SELECT
  DATE(users_logins.login_time - INTERVAL 7 HOUR) AS Date,
  COUNT(DISTINCT users_logins.user_id) AS `Number of Unique Users NightShift`
FROM users_logins
WHERE TIME(users_logins.login_time - INTERVAL 7 HOUR) >= '16:30:00'
AND TIME(users_logins.login_time - INTERVAL 7 HOUR) < '21:00:00'
AND WEEKDAY(DATE(users_logins.login_time - INTERVAL 7 HOUR)) BETWEEN 0 AND 4
GROUP BY 1

UNION 

SELECT
  DATE(users_logins.login_time - INTERVAL 7 HOUR) AS Date,
  COUNT(DISTINCT users_logins.user_id) AS `Number of Unique Users Saturday`
FROM users_logins
WHERE TIME(users_logins.login_time - INTERVAL 7 HOUR) >= '04:00:00'
AND TIME(users_logins.login_time - INTERVAL 7 HOUR) < '21:00:00'
AND WEEKDAY(DATE(users_logins.login_time - INTERVAL 7 HOUR)) = 5
GROUP BY 1

ORDER BY Date DESC

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM