[英]MYSQL Combine results of multiple subqueries
我需要結合以下查詢的結果。 我需要將內部和外部處理的郵件總數一起處理。 讓我為他們解釋查詢和數據
樣本數據:
+---------------------+---------------------+----------------+---------------+----------------+
| deviceCustomString2 | destinationUserName | deviceHostName | deviceProduct | sourceUserName |
+---------------------+---------------------+----------------+---------------+----------------+
| <FD54> | test@dmroot.net | gemslab385mb | Test Server | Exchange |
| <FX54> | test@dmroot.net | gemslabcht | Test Server | Exchange |
| <FZ54> | test2@yahoo.com | gemslab385mb | Test Server | External |
| <FA54> | test@dmroot.net | gemslab385mb | Test Server | Exchange |
| <FD54> | test@dmroot.net | gemslab385mb | Test Server | Exchange |
+---------------------+---------------------+----------------+---------------+----------------+
查詢1:
SELECT
LEFT((LOWER(SUBSTRING_INDEX(b.deviceHostName,'.',1))),(LENGTH(SUBSTRING_INDEX(b.deviceHostName,'.',1))-2)) as "Device_Group",
COUNT(b.deviceCustomString2) as "Total_Messages_Processed_EXTERNAL"
FROM
( SELECT
TEST2.deviceCustomString2,
TEST2.deviceHostName
FROM
TEST2
WHERE
TEST2.deviceProduct="Test Server"
AND
(TEST2.destinationUserName NOT LIKE '%dmroot.net%'
AND TEST2.destinationUserName NOT LIKE '%banco2%'
AND TEST2.sourceUserName NOT LIKE '%Exchange%')
GROUP BY
TEST2.deviceCustomString2,
TEST2.deviceHostName
) as b
查詢1個結果:
+--------------+-----------------------------------+
| Device_Group | Total_Messages_Processed_EXTERNAL |
+--------------+-----------------------------------+
| gemslab385 | 1 |
+--------------+-----------------------------------+
查詢2:
SELECT
LEFT((LOWER(SUBSTRING_INDEX(a.deviceHostName,'.',1))),(LENGTH(SUBSTRING_INDEX(a.deviceHostName,'.',1))-2)) as "Device_Group",
COUNT(a.deviceCustomString2) as "Total_Messages_Processed_INTERNAL"
FROM
( SELECT
TEST2.deviceCustomString2,
TEST2.deviceHostName
FROM
TEST2
WHERE
TEST2.deviceProduct="Test Server"
AND
(
TEST2.destinationUserName LIKE '%dmroot.net%'
OR TEST2.sourceUserName LIKE '%Exchange%'
)
GROUP BY
TEST2.deviceCustomString2
) as a
GROUP BY
Device_group
查詢2結果:
+--------------+-----------------------------------+
| Device_Group | Total_Messages_Processed_INTERNAL |
+--------------+-----------------------------------+
| gemslab385 | 2 |
| gemslabc | 1 |
+--------------+-----------------------------------+
兩個查詢的結果都很好,它可以刪除重復的記錄。
現在,當我在兩個查詢之間添加UNION ALL時,得到此結果
+--------------+-----------------------------------+
| Device_Group | Total_Messages_Processed_EXTERNAL |
+--------------+-----------------------------------+
| gemslab385 | 1 |
| gemslab385 | 2 |
| gemslabc | 1 |
+--------------+-----------------------------------+
總計正確,但未顯示TOTAL_MESSAGES_PROCESSED_INTERNAL。 我如何使其輸出如下所示:
+--------------+-----------------------------------+-----------------------------------+
| Device_Group | Total_Messages_Processed_INTERNAL | Total_Messages_Processed_EXTERNAL |
+--------------+-----------------------------------+-----------------------------------+
| gemslab385 | 2 | 1 |
| gemslabc | 1 | |
+--------------+-----------------------------------+-----------------------------------+
預先感謝您的幫助。
馬切洛
在內部選擇中准備列表,在外部選擇中有條件地對組進行計數。
SELECT
LEFT(LOWER(t.deviceGroup), LENGTH(t.deviceGroup) - 2) AS "Device_Group",
COUNT(DISTINCT
CASE
WHEN t.destinationUserName NOT LIKE '%dmroot.net%' AND
t.destinationUserName NOT LIKE '%banco2%' AND
t.sourceUserName NOT LIKE '%Exchange%'
THEN CONCAT(t.deviceCustomString2, '.', t.deviceHostName)
END) AS "Total_Messages_Processed_EXTERNAL",
COUNT(DISTINCT
CASE
WHEN t.destinationUserName LIKE '%dmroot.net%' OR
t.sourceUserName LIKE '%Exchange%'
THEN CONCAT(t.deviceCustomString2, '.', t.deviceHostName)
END) AS "Total_Messages_Processed_INTERNAL"
FROM (
SELECT
deviceCustomString2,
deviceHostName,
SUBSTRING_INDEX(a.deviceHostName, '.', 1) AS deviceGroup,
destinationUserName,
sourceUserName
FROM TEST2
WHERE deviceProduct="Test Server"
) AS t
GROUP BY Device_Group
在計算組時,我使用以下構造: CONCAT(t.deviceCustomString2, '.', t.deviceHostName)
。 您會更好地了解數據,因此似乎可以將表達式更改為t.deviceCustomString2
或t.deviceHostName
,而只需注意DISTINCT
關鍵字。
另外,為了稍微幫助計算,我將SUBSTRING_INDEX(a.deviceHostName, '.', 1)
移至內部SELECT,因此不會進行兩次評估。
您真正想要的不是工會,而只是普通的加入。 這是一個示例,但我尚未測試語法,因此可能需要一些調整才能起作用:
(SELECT
LEFT((LOWER(SUBSTRING_INDEX(b.deviceHostName,'.',1))),(LENGTH(SUBSTRING_INDEX(b.deviceHostName,'.',1))-2)) as "Device_Group",
COUNT(b.deviceCustomString2) as "Total_Messages_Processed_EXTERNAL", COUNT(a.deviceCustomString2) as "Total_Messages_Processed_INTERNAL"
FROM
( SELECT
TEST2.deviceCustomString2,
TEST2.deviceHostName
FROM
TEST2
WHERE
TEST2.deviceProduct="Test Server"
AND
(TEST2.destinationUserName NOT LIKE '%dmroot.net%'
AND TEST2.destinationUserName NOT LIKE '%banco2%'
AND TEST2.sourceUserName NOT LIKE '%Exchange%')
GROUP BY
TEST2.deviceCustomString2,
TEST2.deviceHostName
) as b LEFT JOIN
( SELECT
TEST2.deviceCustomString2,
TEST2.deviceHostName
FROM
TEST2
WHERE
TEST2.deviceProduct="Test Server"
AND
(
TEST2.destinationUserName LIKE '%dmroot.net%'
OR TEST2.sourceUserName LIKE '%Exchange%'
)
GROUP BY
TEST2.deviceCustomString2
) as a ON a.deviceCustomString2 = b.deviceCustomString2 AND a.deviceHostName = b.deviceHostName
GROUP BY
Device_group
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.