2017-02-15 58 views
4

我正在运行查询以从多个表中返回多行员工小时数据。 有一个有效的条件是员工每天将8小时白天班次交给多个客户进行结算。 我希望跨3列SQL Case语句返回重复行的索引

eg. 

Emp Hrs Date Index 
Fred 8  11/7 1 
Fred 8  11/7 2 
Fred 8  11/7 3 
Fred 10 12/7 1 
Fred 9  13/7 1 

在SELECT语句中,这些更新与任何重复的唯一索引“索引”列为例声明,在索引列返回一个值的重复,但它不't给出一个独特的值

case when count(*) over (partition by Emp, Hrs, Date) > 1 
    then 1 
     else 0 
    end 

我可以包括条件在一个case语句组来实现这个?

+2

为什么需要用查询时可以确定的值更新表?每次碰到桌子时,你喜欢不得不进行这种维护吗?我会把这个计算放在一个视图中,而不是表格中的永久列。 –

回答

3

试试这个:

UPDATE x 
SET x.Index = x.Index_Calc 
FROM 
(
    SELECT Index, ROW_NUMBER() OVER (PARTITION BY Emp, Hrs, Date ORDER BY (SELECT 1)) AS Index_Calc 
    FROM yourTable 
) x 

我根据我的答案关闭this Stack Overflow question,但我相信它应该工作在这里。

+0

你的意思是'分区BY名称,Hrs,d顺序(选择1)',order by是row_number()所必需的,不是吗? – artm

+0

@artm你是对的,在这种情况下,我们可以使用'ORDER BY(SELECT 1)'来避免任何排序。就OP而言,由于存在完全相同的记录,因此我们不关心SQL Server如何选择内部定购。 –

+0

感谢球员们的回应和帮助,因为您可以看到我是新来的论坛,并且正在用SQL变得危险。该表由链接服务器的多个表构建,我们可能应该有Views,但这是我们更好地与Power BI集成的方式。始终学习!:) – Dave

1

您可以通过row_number()partition by来实现此目的。

分区会给你一个行号,每次遇到新的“组”值时都会重置。

create table billings (employee varchar(100), hours decimal(10,2), billed_on date) 
go 

insert into billings values 
('Mike', 8, '2017-02-01'), 
('Mike', 8, '2017-02-01'), 
('Mike', 8, '2017-02-01'), 
('Mike', 8, '2017-02-19'), 
('John', 10, '2017-02-01'), 
('John', 8, '2017-02-01'); 

select employee, hours, billed_on, 
     row_number() over (partition by employee, billed_on order by employee) as ix 
from billings 
order by billed_on, employee, ix 

产地:

employee hours billed_on ix 
1 John  10,00 01.02.2017 1 
2 John  8,00 01.02.2017 2 
3 Mike  8,00 01.02.2017 1 
4 Mike  8,00 01.02.2017 2 
5 Mike  8,00 01.02.2017 3 
6 Mike  8,00 19.02.2017 1 
+0

原始问题要求提供_update_,而不是选择。 –