2016-12-05 4 views
0

集計結果に基づいて新しい列を作成したいとします。例えば、入力データは以下のように(hereから借り):SQL Serverで新しい列として集計を追加する

Company Date Flag 
------- ------- ----- 
001  201201 Y 
001  201201 N 
001  201202 N 
001  201202 N 
001  201202 Y 

私がしたい出力される

Company Date Flag Percentage 
------- ------- ----- ---------- 
001  201201 Y  0.5 
001  201201 N  0.5 
001  201202 N  0.66 
001  201202 Y  0.66 
001  201202 Y  0.66 

あり、Iは、Yの(パーセンテージの凝集に参加する必要がありますフラグの列)をCompanyDateに基づいてもとの表に戻します。

これはおもちゃのデータに過ぎないことに注意してください。私の実際の仕事では、たくさんのテーブルに参加して、目的のテーブルを取得し、いくつかの集計を見つける必要があります。私がやったことは、次のようなものです:

SELECT * 
FROM (
    /* Lots of joins go here to obtain Table A */ 
) AS A 
JOIN (
    SELECT Percentage 
    FROM (
     /* Percentage aggregation from Table A */ 
    ) AS P 
) AS B 
ON A.xxx = B.xx 

問題が集約Percentageを計算するとき、私は再び表Aを生成しなければならないことです。目的のテーブルを2度再生成せずに、集約を目的のテーブルに戻すことは可能ですか?ありがとう。

+0

あなたが選択トンを行うことができます。*(ここではあなたの全体のクエリ)からトンとあなたはなしトンからすべてのフィールドへのアクセス権を持っているよりも何かを再生成する必要があります – GuidoG

+0

テーブルに基づいたビューを作成しない理由はありますか? – Tyron78

+2

[ウィンドウの機能](https://msdn.microsoft.com/en-us/library/ms189461.aspx)で、あなたが何をしているかわかります。 'Percentage = 1.0/COUNT(*)OVER(PARTITION BY Company、日付)' – GarethD

答えて

2

国旗の割合は= Y

Declare @YourTable table (Company varchar(25),Date int, Flag varchar(25)) 
Insert Into @YourTable values 
('001',201201,'Y'), 
('001',201201,'N'), 
('001',201202,'N'), 
('001',201202,'N'), 
('001',201202,'Y') 

Select * 
     ,Pct = cast(sum(case when Flag='Y' then 1.0 else 0 end) over (Partition By Company,Date)/count(*) over (Partition By Company,Date) as decimal(10,2)) 
From @YourTable 

が戻り

Company Date Flag Pct 
001 201201  Y  0.50 
001 201201  N  0.50 
001 201202  N  0.33 
001 201202  N  0.33 
001 201202  Y  0.33 
+0

ありがとう、ジョン。これは本当に役立ちます! –

+0

@AndersonZhuお手伝いします。しかし、GarethDは彼のコメントで最初にそこにいました。その後、私たちは両方ともFLAG条件を学びました。彼の元のコメントへの小さなひねり –

関連する問題