2017-05-25 74 views
2

我有一个表称为“支付”的方法如下:需要“组”的记录,但我没有聚合函数

+----+--------+ 
| ID | Amount | 
+----+--------+ 
| 1 | 1.00 | 
| 2 | 3.00 | 
| 3 | -15.00 | 
| 3 | 20.00 | 
+----+--------+ 

“金额”代表的是现金易手 - 以积极的创纪录金额表示取现金,而记录金额为负则表示现金作为变更返还。

下面的查询:

SELECT ID 
    , CASE WHEN Amount >= 0 THEN Amount END AS CashTaken 
    , CASE WHEN Amount < 0 THEN Amount END AS CashBack 
    FROM Payments 
WHERE TicketID IN ('1', '2', '3') 

......给了我这样的结果集:

+----+-----------+----------+ 
| ID | CashTaken | CashBack | 
+----+-----------+----------+ 
| 1 | 1.00  | NULL  | 
| 2 | 3.00  | NULL  | 
| 3 | NULL  | -15.00 | 
| 3 | 20.00  | NULL  | 
+----+-----------+----------+ 

我怎么能集团这些记录的ID,这样我可以得到以下?

+----+-----------+----------+ 
| ID | CashTaken | CashBack | 
+----+-----------+----------+ 
| 1 | 1.00  | NULL  | 
| 2 | 3.00  | NULL  | 
| 3 | 20.00  | -15.00 | 
+----+-----------+----------+ 

我有点尴尬,因为我觉得这是一件很简单的,是适合在我的面前。

回答

2

你可以尝试用MINMAX

SELECT TicketID 
    , MAX(CASE WHEN Amount >= 0 THEN Amount END) AS CashTaken 
    , MIN(CASE WHEN Amount < 0 THEN Amount END) AS CashBack 
FROM Payments 
WHERE TicketID IN ('1', '2', '3') 
GROUP BY TicketID 

样品执行与给定的数据:

DECLARE @Payments TABLE (TicketID INT, Amount DECIMAL(5,2)); 

INSERT INTO @Payments(TicketID, Amount) 

SELECT 1, 1.00 UNION 
SELECT 2, 3.00 UNION 
SELECT 3, -15.00 UNION 
SELECT 3, 20.00; 

SELECT TicketID 
    , MAX(CASE WHEN Amount >= 0 THEN Amount END) AS CashTaken 
    , MIN(CASE WHEN Amount < 0 THEN Amount END) AS CashBack 
FROM @Payments 
WHERE TicketID IN ('1', '2', '3') 
GROUP BY TicketID 

结果:

TicketID CashTaken CashBack 
--------------------------------- 
1   1.00  NULL 
2   3.00  NULL 
3   20.00  -15.00 
+0

我知道,这是简单的东西,我是远眺。我最终将这个查询加入到我的外部查询中。我忘了你可以在一个查询中有多个聚合函数。我的Payments表还有一个“RecordCreationDate”字段 - 我需要通过ID获得MAX(日期),并且我可以将其转换为相同的查询。谢谢! – Jake