2014-04-21 31 views
0

我在DB2數據庫中有一個表,其中包含我需要檢索的客戶信息以及表中特定列的重複次數。這是一個數據的例子。使用COUNT和GROUP BY的DB2 SELECT語句

CUSTOMERID | CUSTOMERGROUP | PRODUCTID | PRODUCTNAME | ALERTNAME | ALERTLEVEL | XXX | YYY | ZZZ 
12345  ABC    987654  ProductA  Alert1  4   More Data Here 

客戶由CustomerID和CustomerGroup列標識。他們可以擁有任意數量的產品,並且這些產品可以獲得不同類型的警報(ProductA,ProductC和ProductQ都可以獲得Alert1)。我需要檢索每行的客戶信息以及客戶獲取特定警報名的次數。

在我們的舊版本的MySQL數據庫,這是不是太困難,因爲我會做這樣的事情

SELECT customerID, customerGroup, ProductID, ProductName, AlertName, count(AlertName), AlertLevel, more data.... 
FROM TABLE 
WHERE customerID = XXX and customerGroup = YYY 
GROUP BY alertname 
ORDER BY AlertLevel, AlertName, ProductName 

本集團並沒有包括在SELECT語句中的每一列,所以我會回來的客戶行其中包括客戶信息和他們收到特定警報的次數。

現在我們已經遷移到了DB2,我需要將SELECT中的每一列都放到GROUP BY中,這顯然使每一行都不同,因此無論是否存在警報名稱與該客戶的另一行匹配。

有沒有一種方法可以重新創建這種功能,而不需要對數據檢索方式進行重大改動?作爲前端開發人員,我有能力改變我在PHP端操作數據的方式,並且可以編寫SQL語句,但我無法改變數據存儲方式。

+0

我有點驚訝的MySQL允許這樣的聲明,因爲它不是標準的SQL。事實證明,它可以通過MySQL擴展https://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html你可能想要仔細檢查你真正想要的是什麼,因爲我不喜歡聽到「所選擇的值是不確定的」 – Charles

回答

4

你可以做你想要解析函數的內容:

SELECT customerID, customerGroup, ProductID, ProductName, AlertName, AlertCount, 
     AlertLevel, more data.... 
FROM (SELECT t.*, 
      COUNT(*) OVER (PARTITION BY AlertName) as AlertCount, 
      ROW_NUMBER() OVER (PARTITION BY AlertName ORDER BY customerID) as seqnum 
     FROM TABLE t 
     WHERE customerID = XXX and customerGroup = YYY 
    ) t 
WHERE seqnum = 1 
ORDER BY AlertLevel, AlertName, ProductName; 
+0

非常感謝您提供這些信息。使用你的例子,我能夠建立一個完全符合我需要的查詢。看起來我可以在分析功能上做更多的閱讀。 – BMcBride

+0

這不適用於其他DB2平臺。 – WarrenT

1

你可以計算在單獨的查詢次數,然後將其加入到原始查詢:

SELECT customerID, customerGroup, ProductID, ProductName, AlertName, t2.alert_count as AlertName, AlertLevel, more data.... 
    FROM TABLE t1 JOIN (
     SELECT customerid, customergroup, count(AlertName) alert_count 
     FROM table 
     GROUP BY alertname) t2 
    ON t1.customerid = t2.customerid 
    AND t1.customergroup = t2.customergroup 
WHERE customerID = XXX 
    AND customerGroup = YYY 
ORDER BY AlertLevel, AlertName, ProductName