2011-03-12 51 views
0

我做这样的查询:在数据库表如何筛选分组查询结果集(SQL)

 
SELECT Code, 
     kind, 
     SUM(valP) AS value 
FROM transaction 
WHERE tp = 'N' and date = '20110312' 
GROUP BY Code,kind ORDER BY Code,kind; 

,让我这个结果集:

+------+------+------+ 
| Code | kind| value| 
+------+------+------+ 
| 1 | TR | 25,99| 
| 1 | CT | 22,17| 
| 2 | TR | 14,23| 
| 3 | DD | 09,67| 
| 3 | DD | 23,87| 
| 3 | CT | 34,87| 
+------+------+------+ 

代码代表交易代码,种类代表付款类型,价值代表付款的价值。

我想在结果集中包含仅包含类型='CT'的分组结果,但我想在同一个事务中包含其他支付类型,例如我尝试添加一个有到上查询:

 
SELECT Code, 
     kind, 
     SUM(valP) AS value 
FROM transaction 
WHERE tp = 'N' and date = '20110312' 
GROUP BY Code,kind HAVING kind = 'CT' 
ORDER BY Code,kind; 

,但我得到这样的:

+------+------+------+ 
| Code | kind| value| 
+------+------+------+ 
| 1 | CT | 22,17| 
| 3 | CT | 34,87| 
+------+------+------+ 

,而不是我想要检索是这样的:

+------+------+------+ 
| Code | kind| value| 
+------+------+------+ 
| 1 | TR | 25,99| 
| 1 | CT | 22,17| 
| 3 | DD | 09,67| 
| 3 | DD | 23,87| 
| 3 | CT | 34,87| 
+------+------+------+ 

CT类型的记录中的所有事务处理线有没有办法获取?

我该怎么办?

我实际上在SQL Server 2005上工作,但我可能需要在PostgreSQL中运行一个类似的查询。

感谢

回答

2

您可以添加条件,表明“此代码必须与CT行” SA做一个子查询:

SELECT Code FROM transaction WHERE kind='CT' GROUP BY Code ; 

和你的第一个查询添加过滤器只显示那些具有代码在前面的子查询记录:

... AND Code IN (SELECT Code FROM transaction WHERE kind='CT' GROUP BY Code) ... 

这将摆脱记录编号2,因为2不会在结果从第一次查询

1

这应该这样做:

 
SELECT Code, 
     kind, 
     SUM(valP) AS value 
FROM transaction 
WHERE tp = 'N' 
    AND date = '20110312' 
    AND code IN (SELECT t2.code 
       FROM transaction t2 
       WHERE t2.kind = 'CT') 
GROUP BY Code,kind 
ORDER BY Code,kind;