簡體   English   中英

MYSQL合並多個子查詢的結果

[英]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.deviceCustomString2t.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.

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