我做了这样的查询:
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中运行类似的查询。
由于
答案 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;