2017-02-15 2 views
4

複数のテーブルから複数の従業員時間データを返すクエリを実行しています。 従業員が1日8時間の日シフトを複数の顧客に課金するための有効な条件があります。 私はこれらが重複するためにインデックス列の値を返しますが、それはdoesnのCaseステートメントであるSELECTステートメントで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 

間で重複のためのユニークなインデックスを持つ「インデックス」欄を更新したいです一意の値を与える

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

これを達成するには、条件文を条件ごとに含めることができますか?

+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の名前、時間、順序(選択1)'、row_number()の順序は必須ですか? – artm

+0

@artmそうですが、この場合、順序を避けるために 'ORDER BY(SELECT 1)'を使うことができます。 OPの場合、完全に同一に見えるレコードが存在するため、SQL Serverが内部的にどのように注文するかは気にしません。 –

+0

私はフォーラムやSQLで危険になっていることを初めて知りましたので、ご返信いただきありがとうございました。このテーブルは、リンクされたサーバーの複数のテーブルから構築されており、ビューを持つ必要がありますが、それが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_を要求しました。 –

関連する問題