2015-10-26 109 views
1

以下查詢爲我提供了我需要的信息,但我希望它只是更進一步。在底部的表格中(只顯示字段的子集),我想按cust_line以不尋常的方式進行分組(至少在我看來這是不常見的)。一個將聚合值和非聚合值組合在一行中的SQL查詢

我們來看一下cust_line爲2的項目爲例。我希望這些代碼不是5行。對於這一行,我想選擇除cust_part =「GROUPINVC」之外的價格字段以外的所有字段。對於總字段,我希望它是'total(total)as new_total',對於價格,我希望它是new_total/qty_invoiced,其中qty_invoiced是cust_part =「GROUPINV」行上的值。

我要求的是完全荒謬的嗎?它甚至有可能嗎?我在SQL上並不先進,所以它可能也很容易,我只是不知道如何處理它。我想使用'分區',但我無法想象如何得到它的工作,因爲我認爲它仍然會返回5行,我只想要1 1.

我也看過類似的問題冠軍,但不是真的是我要找:

SQL query that returns aggregate AND non aggregate results

Combined aggregated and non-aggregate query in SQL

SELECT L.CUST_LINE, I.LINE_NO, I.ORDER_NO, I.STAGE, I.ORDER_LINE_POS, I.CUST_PART, 
I.LINE_ITEM_NO, I.QTY_INVOICED, I.CUST_DESC, I.DESCRIPTION, I.SALE_UNIT_PRICE, I.PRICE_TOTAL, 
I.INVOICE_NO, I.CUSTOMER_PO_NO, I.ORDER_NO, I.CUSTOMER_NO, I.CATALOG_DESC, I.ORDER_LINE_NOTES 
FROM 
    (SELECT CUST_LINE, ORDER_NO, LINE_NO 
    FROM CUSTOMER_ORDER_LINE 
    GROUP BY CUST_LINE, ORDER_NO, LINE_NO 
    ) L 
INNER JOIN CUSTOMER_ORDER_IVC_REP I 
ON I.ORDER_NO = L.ORDER_NO 
WHERE RESULT_KEY = 999999 
AND I.LINE_NO = L.LINE_NO 
ORDER BY L.CUST_LINE; 

| cust_line | line_no | cust_part | qty_invoiced | cust_desc | price | total | 
|   1 |  4 |  ... |   1 |  ... | 55 | 55 | 
|   2 |  1 | GROUPINV |   1 | some part |  0 | 0 | 
|   2 |  6 |  ... |   3 |  ... |  0 | 0 | 
|   2 |  2 |  ... |   1 |  ... |  0 | 0 | 
|   2 |  3 |  ... |   1 |  ... |  0 | 0 | 
|   2 |  7 |  ... |   2 |  ... | 10 | 20 | 
|   3 |  7 |  ... |   1 |  ... | 67 | 67 | 
+0

在你的問題中沒有PL/SQL –

+0

我使用的是Oracle數據庫,所以我認爲這可能會以某種方式來解決問題。 – jaromey

+0

爲什麼你認爲你需要一個存儲過程? –

回答

0

您可以使用分析功能來計算總計超過一個結果集的多個行,然後濾除行你不wa NT。

離開了所有的額外列爲簡潔起見:

SELECT cust_line, qty_invoiced, order_total/qty_invoiced AS price 
FROM (
    SELECT l.cust_line, qty_invoiced, 
    SUM(total) OVER (PARTITION BY l.cust_line) AS order_total, 
    COUNT(cust_line) OVER (PARTITION BY l.cust_line) AS group_count 
    FROM 
    (SELECT CUST_LINE, ORDER_NO, LINE_NO 
    FROM CUSTOMER_ORDER_LINE 
    GROUP BY CUST_LINE, ORDER_NO, LINE_NO 
    ) L 
    INNER JOIN CUSTOMER_ORDER_IVC_REP I 
    ON I.ORDER_NO = L.ORDER_NO 
    WHERE RESULT_KEY = 999999 
    AND I.LINE_NO = L.LINE_NO 
) 
WHERE (cust_part = 'GROUPINV' OR group_count = 1) 
ORDER BY cust_line 

我你想要的PARTITION BY子句中什麼猜測;這本質上是GROUP BY,僅適用於SUM函數。不知道你是否也想在分區中使用order_no

訣竅是選擇內部查詢中的所有行,將SUM應用於所有行;然後在最外面的查詢中篩選出您不感興趣的行。

+1

美麗!奇蹟般有效。我不得不添加一些東西給它。 where子句過濾除'分組'行以外的所有內容,所以我添加了count(cust_line)OVER(PARTITION BY cust_line)作爲group_count,然後在我的WHERE分類中添加了'OR group_count = 1。我不介意修改您的答案反映了這對未來觀衆的利益。再次感謝! – jaromey

+0

一個奇怪的事情,但。當我將其他分區添加到select語句時,oracle sql開發人員用一個橙色的曲線標明瞭「SELECT list與GROUP BY不一致」,並建議將所有未計算的項目添加到我的group by子句中。查詢工作正常,但我們使用的不是一個分組。我從來沒有對oracle sql開發者的語法突出信心(這來自一個只使用它一週的人)。 – jaromey

+0

很高興幫助。根據你的評論編輯答案 - 我想我正確地捕獲了它。你對SQL Developer非常正確;其語法規則不完整。即使一些關鍵字不被識別。 –