2017-03-08 33 views
2

我寫了幾個SQL查詢並對我的表執行它們。每個單獨的查詢工作。我一直在添加功能,直到我有一個非常難看的工作查詢。問題是每次我想使用它時都必須手動更改一個值。你能幫助自動而不是「手動」的查詢嗎?如何修改查詢以遍歷整個表格而不是單個頁面

我正在使用DB2。

下表顯示了客戶(cid)從1到3.'club'是圖書銷售商,'qnty'是客戶從每個'俱樂部'購買的圖書數量。全表有45個客戶。 enter image description here

下圖顯示了前3個用戶(cid = 1或cid = 2或cid = 3)的所有表格元素。我的所有查詢(一旦合併)的最終目的是找到每個'cid'具有最大'qnty'的單個'俱樂部'。因此對於'cid = 1','俱樂部'是'qnty'爲3的讀者文摘。對於'cid = 2','club'是YRB Gold,其中'qnty'是5.一直到cid 45達到。

enter image description here

爲了給你什麼,我在這裏做一個背景是我的疑問:

(查詢1起爲cid=1點)

SELECT * FROM yrb_purchase WHERE cid=1 enter image description here

(查詢2 - 找到cid = 1的'qnty'最高的'俱樂部')

SELECT * 
FROM 
(SELECT club, 
     sum(qnty) AS t_qnty 
FROM yrb_purchase 
WHERE cid=1 
GROUP BY club)results 
ORDER BY t_qnty DESC 

enter image description here

(查詢3 - 從上面的查詢相結合的紀錄,這是CID)

SELECT cid, 
    temp.club, 
    temp.t_qnty 
FROM yrb_purchase AS p, 

(SELECT * 
FROM 
    (SELECT club, 
      sum(qnty) AS t_qnty 
    FROM yrb_purchase 
    WHERE cid=1 
    GROUP BY club)results 
ORDER BY t_qnty DESC FETCH FIRST 1 ROWS ONLY) AS TEMP 
WHERE p.cid=1 
AND p.club=temp.club 

enter image description here

(查詢4)確保有用於CID只有一條記錄= 1

SELECT cid, 
    temp.club, 
    temp.t_qnty 
FROM yrb_purchase AS p, 

(SELECT * 
FROM 
    (SELECT club, 
      sum(qnty) AS t_qnty 
    FROM yrb_purchase 
    WHERE cid=1 
    GROUP BY club)results 
ORDER BY t_qnty DESC FETCH FIRST 1 ROWS ONLY) AS TEMP 
WHERE p.cid=1 
AND p.club=temp.club FETCH FIRST ROWS ONLY 

enter image description here

要讓客戶2獲得'qnty'最高的'club',我只需在上面的最後一個查詢中將文本cid = 1更改爲cid = 2。我的查詢似乎總是會產生正確的結果。我的問題是,如何修改我的查詢以獲得單個表中所有'cid's從1到45的結果?我該如何獲得一張包含所有cid值的表格以及出售cid最多書籍的俱樂部,以及在一個tablei內銷售了多少本書?請記住,我希望您可以修改我的查詢,而不是提供更好的查詢。

如果您認爲我的查詢太難看(我同意你)並選擇提供另一個查詢,請注意,我剛開始學習SQL,可能無法理解您的查詢。你應該知道我已經問過這個問題:For common elements, how to find the value based on two columns? SQL但我無法做出答案的工作(由於我的SQL限制 - 不是因爲答案不好);在沒有工作答案的情況下,我無法對其進行逆向工程,以瞭解它是如何工作的。 在此先感謝

****************************編輯#1 *********** ******************************** 答案的結果是:

enter image description here

+0

請閱讀http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload-images-of-code在此提問/ 285557和接受的答案 –

回答

1

你可以使用OLAP /窗口功能來實現這一目標:

SELECT 
    cid, 
    club, 
    qnty 
FROM 
    (
     SELECT 
      cid, 
      club, 
      qnty, 
      ROW_NUMBER() OVER (PARTITION BY cid order by qnty desc) as cid_club_rank 
     FROM 
      (
       SELECT 
        cid, 
        club, 
        sum(qnty) as qnty 
       FROM yrb_purchase 
       GROUP BY cid, club 
      ) as sub1 
    ) as sub2 
WHERE cid_club_rank = 1 

最裏面的語句(SUB1)剛剛抓住一個總量爲每個CID /俱樂部組合。第二個內部最大聲明(sub2)爲每個按數量排序的每個cid/club組合創建一個row_number(自上而下)。然後,最外面的查詢只選擇row_number()爲1的記錄。

+0

感謝您的幫助!當我運行你的查詢時,我得到一個錯誤。消息是:'SQL0104N在「(qnty)as qnty,FROM」後面找到了一個意外標記「yrb_purchase」。預期的標記可能包括:「FROM」。 SQLSTATE = 42601'有什麼建議嗎? – Mike

+0

對不起,那裏有一個流浪的逗號。 – JNevill

+0

對不起,打擾你...我試圖讓答案工作,但我一直打牆我不明白。現在是錯誤'SQL0440N找不到具有兼容參數的「FUNCTION」類型的名爲「SUB」的授權例程。 SQLSTATE = 42884'。我試圖在網上找到'sub()'函數來理解它,但奇怪的是,我沒有太多運氣。再一次,真的很感激你的時間! – Mike

相關問題