SQL Server中的条件计算

时间:2015-12-03 08:05:29

标签: sql-server

朋友:   我现在有一个关于SQL Server中的条件计算的问题。   我在SQL Server中设置了一些数据作为excel中的一个例子:

No    Employee  Month   Commission1 Commission2
1     A         Jan        10          5
2     A         Jan        10          4
3     B         Jan        15          3
4     B         Jan        15          4
5     C         Jan        10          3
6     C         Jan        10          4
7     D         Jan        13          3
8     D         Jan        13          4
9     DM        Jan        0           6
10    DM        Jan        0           8
11    A         Feb        15          4
12    A         Feb        15          5
13    B         Feb        20          5
14    B         Feb        20          4
15    C         Feb        9           3
16    C         Feb        9           4
17    D         Feb        14          5
18    D         Feb        14          6
19    DM        Feb        0           13
20    DM        Feb        0           10

我想要的结果是这样的:

Employee    Jan             No#     Feb             No#  
A           20              2       30              2  
B           30              2       40              2  
C           20              2       18              2  
D           26              2       28              2  
DM          44              10      59              10  

对于每次销售,员工A,B,C,D只有佣金1作为付款,佣金2是DM。因此,在1月,DM的佣金是SUM(E2:E9)

我可以在excel中轻松完成,但是如何在sql server中执行此操作?

我尝试这样的代码:

select [Month],Employee,SUM(Commission1) Commission,count(distinct([No]))     No#
from table1
WHERE Employee IN ('A','B','C','D')
group by [Month],Employee
union
select 'DM' as Employee,[Month],SUM(Commission2)     Commission,count(distinct([No])) No#
from table1
WHERE Employee IN ('A','B','C','D','DM')
group by [Month],Employee

我得到了结果

Employee    Month   Commission  No#
A           Jan      20         2
B           Jan      30         2
C           Jan      20         2
D           Jan      26         2
DM          Jan      44         10
A           Feb      30         2
B           Feb      40         2
C           Feb      18         2
D           Feb      28         2
DM          Feb      59         10

结果格式不是我想要的。我在此查询后试过了pivot,但是失败了,似乎我只能转动一个状态?

另一个问题:如果我想在结果中自动增加月份增长(在实际数据中,不仅有1月和2月),而不是在[0],[2],[3月] ...在数据透视代码中,如何做到了吗?

谁能帮帮我?

谢谢!

2 个答案:

答案 0 :(得分:1)

以下是PIVOT解决方案:

测试数据:

DECLARE @t table(Employee varchar(2), Month char(3), Commission1 int, Commission2 int)
INSERT @t values
('A','Jan',10,5 ),('A','Jan',10,4),('B','Jan',15,3),
('B','Jan',15,4 ),('C','Jan',10,3),('C','Jan',10,4),
('D','Jan',13,3 ),('D','Jan',13,4),('DM','Jan',0,6),
('DM','Jan',0,8 ),('A','Feb',15,4),('A','Feb',15,5),
('B','Feb',20,5 ),('B','Feb',20,4),('C','Feb',9,3),
('C','Feb',9,4  ),('D','Feb',14,5),('D','Feb',14,6),
('DM','Feb',0,13),('DM','Feb',0,10)

查询:

;WITH CTE as
( 
 SELECT
   Employee, Month, 
   CASE WHEN Employee = 'DM' THEN
   SUM(Commission2) over (partition by [Month])
   ELSE Commission1 END com,
   CASE WHEN Employee = 'DM' 
   THEN row_number() over
      (PARTITION BY Employee, [Month] ORDER BY (SELECT 1)) ELSE 1 END rn
 FROM @t
) 
SELECT Employee, [Jan], [Feb], [Mar] -- add more months
FROM  
CTE
PIVOT 
(SUM(com) 
 FOR [Month] IN ([Jan], [Feb], [Mar])) AS pvt -- add more months
 WHERE rn = 1

结果:

Employee    Jan Feb Mar
A           20  30  NULL
B           30  40  NULL
C           20  18  NULL
D           26  28  NULL
DM          44  59  NULL

答案 1 :(得分:0)

在SqlServer中,您可以使用PIVOT运算符执行此操作,如下所示:
请参阅PIVOT语法

select tmp.employee,pv.[jan] as Jan_Commission, pv.[feb] as Feb_Commission from 

(
select employee,month,commission1 from table_name

)tmp
pivot (
sum(commission1)  
for [month] in ([jan],[feb])

)pv;