如何筛选分组查询结果集(SQL)

时间:2011-03-12 12:55:00

标签: sql sql-server sql-server-2005 postgresql

我做了这样的查询:

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 个答案:

答案 0 :(得分:2)

您可以添加条件,告诉“此代码必须有CT行”sa执行子查询:

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

在第一个查询中添加一个过滤器,仅显示那些在以前的子查询中包含Code的记录:

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

这将取消记录代码2,因为2将不会出现在第一次查询的结果中

答案 1 :(得分: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;