2015-01-13 4 views
1

SQL Server 2014를 사용하고 있으며 어려운 쿼리에 도움이되지 않습니다.고유 한 다중 열 패턴 계산

다음 표 (MyTable)가 있습니다. 이러한 열 이름은 예에 불과합니다. 그들은 실제로 서로 완전히 다릅니다.

id int, 
col1 int, 
col2 int, 
.. 
.. 
.. 
col70 int 
순차 열의 각 쌍

{(COL1, COL2), (col2_col3) (col69_col70)}, i는 다음 계산해야 각 값을 갖는다 다른 쌍의 수 - col_i는 정적 열이고 col_i + 1은 다른 열입니다. 각 값은 표의 총 레코드 수로 나눠야합니다. 예를 들어

col1 | col2 
45 | 789 
56 | 345 
99 | 234 
45 | 789 
45 | 222 
89 | 678 
89 | 345 
45 | 789 
90 | 234 
12 | 567 

계산 :

((45, 789)+(45, 222))/10 
(56, 345)/10 
(99, 234)/10 
(45, 789)+(45, 222)/10 
(45, 789)+(45, 222)/10 
(89, 678)+(89, 345)/10 
(89, 678)+(89, 345)/10 
((45, 789)+(45, 222))/10 
(90, 234)/10 
(12, 567)/10 

출력 : 제 레코드

col1_col2 
    0.2 
    0.1 
    0.1 
    0.2 
    0.2 
    0.2 
    0.2 
    0.2 
    0.1 
    0.1 

설명 : 45 정적 열의 값이며, 그래서 이제는 확인할 것 col2로 얼마나 많은 조합을 찾을 수 있습니까?

45 | 789 
45 | 789 
45 | 222 
45 | 789 

총 고유 조합을 테이블의 레코드 수로 나눈 값 : 2/10 = 0.2

이 계산에는 각 쌍의 연속 열이 필요합니다. 어떤 추천? 각 쌍에 대해 줄이 포함 된 쿼리를 작성하는 대신 자동으로 계산하는 스마트 방법이 있습니까?

+0

다음, 함수를 만드는 쿼리에 사용할 수 있습니까? – HaveNoDisplayName

+0

왜 비슷한 데이터를 사용하는 많은 분야가 있습니까? 결함있는 모델처럼 보입니다. –

+0

@GoatCO 이것이 내가 클라이언트에서 데이터를 얻은 방법입니다. 나는 구조를 바꿀 수 없다. – Omri

답변

0

예 기본 키를 가지고 가정 :

create table my_table 
(column_id int not null, 
column1 int not null, 
column2 int not null); 

insert into my_table 
(column_id, column1, column2) 
values 
(1, 45,789), 
(2, 56,345), 
(3, 99,234), 
(4, 45,789), 
(5, 45,222), 
(6, 89,678), 
(7, 89,345), 
(8, 45,789), 
(9, 90,234), 
(10, 12,567); 

declare @column_a as nvarchar(100) = N'column1'; 
declare @column_b as nvarchar(100) = N'column2'; 
declare @result_column as nvarchar(100) = N'column1_2'; 
declare @sql_string as nvarchar(4000) 

set @sql_string = 
'select a.column_id, 
1.0 * count(distinct b.' + @column_b + ')/(count(a.' + @column_a + ') over()) as ' + @result_column 
+ ' from my_table a 
inner join my_table b 
on a.' + @column_a + ' = b.' + @column_a + 
' group by a.column_id, a.' + @column_a + 
' order by a.column_id'; 

-- print @sql_string; 
execute(@sql_string); 

이 당신이 식별자를 만들 수 ROWNUMBER() 함수를 사용할 수있는 기본 키가 없습니다,하지만 결과 순서가 변경한다면. print 명령은 주석 처리 된 동적 SQL 문자열을 확인하는 데 유용 할 수 있습니다.

저장 프로 시저로 동적 SQL 퍼팅 :

create procedure column_freq @column_a nvarchar(100), @column_b nvarchar(100), @result_column nvarchar(100) 
as 
begin 
    declare @sql_string as nvarchar(4000); 

    set @sql_string = 
    'select a.column_id, 
    1.0 * count(distinct b.' + @column_b + ')/(count(a.' + @column_a + ') over()) as ' + @result_column 
    + ' from my_table a 
    inner join my_table b 
    on a.' + @column_a + ' = b.' + @column_a + 
    ' group by a.column_id, a.' + @column_a + 
    ' order by a.column_id'; 

    execute(@sql_string); 
end; 
go 

exec column_freq N'column1', N'column2', N'column1_2'; 
go