2011-06-14 49 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