2011-06-14 77 views
2

我在那有一个表AssignmentMaster我有一个数据集团在子查询

AssignmentID   PaidAmount  RefundAmount UserID 
1      20    0    1 
2      10    5    1 
3      30    7    2 
4      25    0    3 
5      35    15    3 
6      10    3    1 
7      5    0    3 
8      10    0    3 

现在我想找出相对于用户ID的TotalNumberofAssignment以下几列,即结果应该是:

UserID TotalAssignment TotalAssignmentofRefundAmount TotalPaidAmount TotalRefundAmount 
1    3     2      40    8 
2    1     1      30    7 
3    4     1      75    15 

如何在MSSQL中获得以上结果。 你的任何帮助将帮助我很多。

回答

4
SELECT 
    UserID, 
    COUNT(AssignmentID) AS TotalAssignment, 
    SUM(SIGN(RefundAmount)) AS TotalAssignmentofRefundAmount, 
    SUM(PaidAmount) AS TotalPaidAmount, 
    SUM(RefundAmount) AS TotalRefundAmount 
FROM 
    MyTable 
GROUP BY 
    UserID 

注:

SIGN(RefundAmount)作品如果REFUNDAMOUNT总是> = 0

如果没有,更改为

SUM(CASE WHEN RefundAmount <> 0 THEN 1 ELSE 0 END) AS TotalAssignmentofRefundAmount 
+3

“SIGN”解决方案的+1。 – 2011-06-14 12:24:23

+1

对于新的sql关键字(SIGN)+1,你能告诉我SIGN是如何工作的吗?谢谢Vijendra – Vijjendra 2011-06-14 12:29:03

+2

SIGN与ABS(x)/ x相同。当x> 0时,SIGN(x)= 1。当x <0时,SIGN(x)= -1。 SIGN(0)= 0. – UltraCommit 2011-06-14 12:31:32

3
Select UserID, 
     count(1) as TotalAssignment, 
     sum(case when RefundAmount = 0 then 0 else 1 end) as TotalAssignmentofRefundAmount, 
     sum(PaidAmount) as TotalPaidAmount , 
     sum(RefundAmount) as TotalRefundAmount 
From AssignmentMaster 
Group by UserID 
1
select UserId, count (AssignmentID) as TotalAssignment, 
sum(case when RefundAmount = 0 then 0 else 1 end) as TotalAssignmentofRefundAmount, 
sum(PaidAmount) as TotalPaidAmound, 
sum(RefundAmount) as TotalRefundAmount 
from AssignmentMaster 
group by UserID; 
+1

AFAIK,SQL Server没有'DECODE'功能,即Oracle特定的语法。您可以将其更改为“CASE”声明。 – 2011-06-14 12:27:09

+0

刚刚更正,谢谢。 – UltraCommit 2011-06-14 12:27:52

+1

此外,您可能需要将用户ID添加到选择列表中以提高结果的可读性。 – eftpotrm 2011-06-14 13:37:56

1

为了显示怎么办这使用嵌套的SQL:

Select UserTotals.UserID, UserTotals.TotalAssignment, 
     Refunds.TotalAssignmentofRefundAmount, 
     UserTotals.TotalPaidAmount, UserTotals.TotalRefundAmount 
From (select  UserID, 
        Count(AssignmentID) [TotalAssignment], 
        Sum(PaidAmount)  [TotalPaidAmount], 
        sum(RefundAmount) [TotalRefundAmount] 
        From  @AssignmentMaster 
        Group By UserID 
     ) [UserTotals] Left Join 
     (Select  UserID, 
        Count(AssignmentID) [TotalAssignmentofRefundAmount] 
        From  @AssignmentMaster 
        Where  RefundAmount > 0 
        Group By UserID 
     ) [Refunds] On Refunds.UserID = UserTotals.UserID