2009-09-22 93 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