2009-09-22 53 views
0

我有以下查詢查找從同一個客戶中取消自己的交易(有些交易爲負數)。如何獲得組成GROUP BY ... HAVING查詢的行的ID?

SELECT c, ABS(r) magnitude, SUM(r) total, COUNT(*) num 
FROM table 
GROUP BY c, magnitude 
HAVING num > 1 AND total = 0 
ORDER BY total 

此查詢的結果是客戶ID,訂單的大小,即取消自己出(零)訂單的總和,並且一起加起來零成交的數量。

我該如何去取得組成COUNT(*)的行ID?

我想結束包含這些行的ID的單列結果集。

回答

0
SELECT id 
FROM (
     SELECT c, ABS(r) magnitude, SUM(r) total, COUNT(*) num 
     FROM table 
     GROUP BY 
       c, magnitude 
     HAVING num > 1 AND total = 0 
     ) td 
JOIN table to 
ON  to.c = td.c 
     AND to.r IN (magnitude, -magnitude) 

(c, r)創建索引將改善查詢。

SQL ServerOraclePostgreSQL 8.4你也可以做到以下幾點:

SELECT id 
FROM (
     SELECT id, 
       SUM(r) OVER (PARTITION BY c, ABS(r)) total, 
       COUNT(*) OVER (PARTITION BY c, ABS(r)) num 
     FROM table 
     ) q 
WHERE num > 1 AND total = 0 
+0

第二個查詢也可以在Sybase SQL Anywhere上運行,這正是我所處的。但是,它會返回一個空的結果集。如果從總列中的SUM()中移除ABS()函數,它將按需要工作。如果你總結'ABS()','total'不能爲零。 – 2009-09-22 14:38:19

+0

我按照上面所述編輯了查詢。 – 2009-09-22 14:39:01

0

出於某種原因,我認爲標籤說MySQL。我很愚蠢。


你可能要考慮的group_concat功能,這將讓你有一列是所有在列表中連接在一起的組中的ID。

這對於閱讀列表的人來說並不會有用。如果你想根據結果做更多​​的查詢或計算,那麼這不是一個好的選擇。

但基本上你可以做這樣的事情:

SELECT c, ABS(r) magnitude, SUM(r) total, COUNT(*) num, 
    GROUP_CONCAT(ID SEPARATOR ', ') id_list 
FROM table 
GROUP BY c, magnitude 
HAVING num > 1 AND total = 0 
ORDER BY total 
+0

我不使用MySQL,所以這不會是我的解決方案,但它可能會幫助別人。謝謝! – 2009-09-22 14:24:26

+0

我應該多加註意。我可以發誓我看到了一個MySQL標籤。我一定在同一時間看另一個問題。我希望稍後有人能夠使用它。 – Welbog 2009-09-22 14:26:41