2011-06-13 86 views
2

我一直在嘗試幾個小時,但無法通過查詢,我想使用DB2來執行以下操作。從表公司和用戶我有每個公司下面的票量信息/用戶db2查詢頂部組

QUERY USING: 
SELECT T.USER, COUNT(T.USER) AS QUANITTY, T.COMPANY FROM TICKET T 
INNER JOIN COMPANY P ON P.COMPANY = T.COMPANY 
GROUP BY (T.USER, T.COMPANY) ORDER BY QUANTITY DESC 

的結果是:

user   company  quantity 
---------------------------------- 
mark   nissn  300 
tom   toyt   50 
steve  kryr   80 
mark   frd   20  
tom   toyt   120  
jose   toyt   230  
tom   nissn  145  
steve  toyt   10  
jose   kryr   35  
steve  frd   100 

這應該是結果(按公司熱門用戶)

user   company  quantity 
---------------------------------- 
mark   nissn  300  
jose   toyt   230  
steve  frd   100  
steve  kryr   80 

,因爲您可以看到公司中有許多用戶,每個公司的數量各不相同,因此結果爲 會使用戶獲得每家公司的最高數量。即:公司nissn它有2個用戶,每個人都有(300號)和(與145 TOM)

所以應該給我這將是與300標記的同樣將是toytfrd最高的用戶, kryr。我需要查詢中的所有人。
我不知道這是可能的查詢或我需要創建一個存儲過程。

回答

6

你可以用analytic queries來做到這一點。不過要小心。該模式通常用於涉及嵌套子查詢。 (一個產生數據集,下一個將其添加到模式,第三個選擇你想要的行。)

在這種情況下,它應該看起來像這樣。

原始查詢。

SELECT T.USER, COUNT(T.USER) AS QUANTITY, T.COMPANY 
FROM TICKET T 
    JOIN COMPANY P 
    ON P.COMPANY = T.COMPANY 
GROUP BY (T.USER, T.COMPANY) 

分析查詢。 (請注意,s是命名的子查詢。我沒有用過DB2,但標準嚴格並不妨礙他們被丟棄了,我知道,他們需要至少一個數據庫。)

SELECT user, quantity, company 
    , RANK() OVER (PARTITION BY company ORDER BY quantity DESC) as r 
FROM (... previous query ...) s 

決賽結果。

SELECT user, quantity, company 
FROM (... previous query ...) t 
WHERE r = 1 

合併查詢是:

SELECT user, quantity, company 
FROM (
    SELECT user, quantity, company 
     , RANK() OVER (PARTITION BY company ORDER BY quantity DESC) as r 
    FROM (
     SELECT T.USER, COUNT(T.USER) AS QUANTITY, T.COMPANY 
      FROM TICKET T 
       JOIN COMPANY P 
       ON P.COMPANY = T.COMPANY 
      GROUP BY (T.USER, T.COMPANY) 
    ) s 
) t 
WHERE r = 1 

正如我說我沒有使用DB2。但根據SQL標準,該查詢應該可以工作。

+0

你給了我正確的答案,是的它也適用於DB2!我一直在試圖做到這一點,但無法弄清楚。謝謝bubby! – 2011-06-13 22:51:43

+0

在iSeries上的DB/2上進行測試,確實可行! – Bjinse 2013-05-23 12:57:36

+0

另外,考慮使用Dense_Rank()而不是Rank()來管理兩家公司之間的聯繫。非常好的工作將其分解成逐步的說明@btilly – codemonkey 2014-07-18 16:24:47