2014-12-12 2 views
0

필자가 필요로하고 예제를 찾을 수없는 질문/답변을 찾을 수 없습니다. 나는 창 함수를 사용하고 싶다.TSQL이 창을 넘었습니다.

I가 그 발동에 사용되는 저장 발동하고 테이블과 열 보유하고있는 다음 스키마 : 나는 테이블 이름 다른 절차 나타 횟수를 계산하려면

CREATE TABLE [dbo].[ProcedureDependencies](
[DatabaseName] [varchar](256) NOT NULL, 
[ProcedureId] [int] NOT NULL, 
[ProcedureSchemaName] [varchar](256) NOT NULL, 
[ProcedureName] [varchar](256) NOT NULL, 
[TableSchemaName] [varchar](256) NOT NULL, 
[TableName] [varchar](256) NOT NULL, 
[FieldName] [varchar](256) NOT NULL) 

을 .

나는 다음의 변화를 시도하고있다 :

select 
    DatabaseName, 
    TableName, 
    count(tablename) over (partition by DatabaseName,ProcedureName) cnt 
from ProcedureDependencies 
order by cnt desc 

을 그러나, 나는 나쁜 결과를 얻고있다. 내가 원하는에 따라 스크립트의 예를, .... 들어

databasename tablename cnt 
db1    tbl1   3 
db1    tbl2   1 
db1    tbl3   1 

그러나 나는군요 ....

databasename tablename cnt 
db1    tbl1   3 
db1    tbl2   3 
db1    tbl3   3 
db1    tbl1   1 

스크립트 :

drop table #tmprmd; 
create table #tmprmd (
    DatabaseName varchar(max), 
    TableName varchar(max), 
    ProcedureName varchar(max), 
    FieldName varchar(max)); 
Insert Into #tmprmd 
Values ('db1',  'tbl1',  'proc1', 'field1'), 
     ('db1',  'tbl1',  'proc1', 'field2'), 
     ('db1',  'tbl2',  'proc1', 'field1'), 
     ('db1',  'tbl1',  'proc2', 'field1'), 
     ('db1',  'tbl3',  'proc1', 'field1'), 
     ('db1',  'tbl1',  'proc3', 'field1'); 
with 
dist as (
    select 
     --distinct 
     databasename, 
     procedurename, 
     tablename 
    from #tmprmd--ProcedureDependencies 
) 
select 
distinct 
    DatabaseName, 
    TableName, 
    count(tablename) over (partition by DatabaseName,procedurename) cnt 
from dist 
order by cnt desc 
+0

Shorednt 4,1,1 원하는 결과가 있습니까? – Mihai

+1

@Mihai 아니요, 3,1,1 – Vasily

답변

2

당신이 이것을 필요 이상으로 어렵게 만들고 있다고 생각합니다.

drop table #tmprmd; 
create table #tmprmd (
    DatabaseName varchar(max), 
    TableName varchar(max), 
    ProcedureName varchar(max), 
    FieldName varchar(max)); 
Insert Into #tmprmd 
Values ('db1',  'tbl1',  'proc1', 'field1'), 
     ('db1',  'tbl1',  'proc1', 'field2'), 
     ('db1',  'tbl2',  'proc1', 'field1'), 
     ('db1',  'tbl3',  'proc1', 'field1'), 
     ('db1',  'tbl1',  'proc2', 'field1'),  
     ('db1',  'tbl1',  'proc3', 'field1'); 
select dist.DatabaseName, dist.TableName, count(distinct(procedurename)) 
from #tmprmd as dist 
group by dist.DatabaseName, dist.TableNameName 
0
 IF OBJECT_ID('Tempdb..#tmprmd') IS NOT NULL 
      DROP TABLE #tmprmd 
     CREATE TABLE #tmprmd 
      (
       DatabaseName VARCHAR(MAX) , 
       TableName VARCHAR(MAX) , 
       ProcedureName VARCHAR(MAX) , 
       FieldName VARCHAR(MAX) 
      ); 
     INSERT INTO #tmprmd 
     VALUES ('db1', 'tbl1', 'proc1', 'field1'), 
       ('db1', 'tbl1', 'proc1', 'field2'), 
       ('db1', 'tbl2', 'proc1', 'field1'), 
       ('db1', 'tbl1', 'proc2', 'field1'), 
       ('db1', 'tbl3', 'proc1', 'field1'), 
       ('db1', 'tbl1', 'proc3', 'field1'); 
---------------------------------------------------------- 
    -- variant 1 
     WITH cte 
        AS (SELECT DISTINCT 
           T.DatabaseName , 
           T.TableName , 
           COUNT(*) OVER (PARTITION BY T.DatabaseName, T.ProcedureName, T.TableName) cnt 
         FROM  #tmprmd AS T 
        ) 
      SELECT DISTINCT 
        DatabaseName , 
        TableName , 
        SUM(cte.cnt) OVER (PARTITION BY DatabaseName, TableName) cnt 
      FROM cte 
---------------------------------------------------------- 
    --variant 2 
    SELECT DISTINCT dist.DatabaseName, 
        dist.TableName, 
        MAX(cnt) OVER (PARTITION BY dist.DatabaseName, dist.TableName) cnt 
    FROM ( SELECT DISTINCT T.DatabaseName, 
          T.TableName, 
          DENSE_RANK() OVER (PARTITION BY T.TableName order by T.ProcedureName) cnt 
      FROM #tmprmd AS T 
     ) dist 
---------------------------------------------------------- 
    --variant 3 
    SELECT DISTINCT dist.DatabaseName, 
        dist.TableName, 
        COUNT(cnt) OVER (PARTITION BY dist.DatabaseName, dist.TableName) cnt 
    FROM ( SELECT DISTINCT T.DatabaseName, 
          T.TableName, 
          DENSE_RANK() OVER (PARTITION BY T.TableName order by T.ProcedureName) cnt 
      FROM #tmprmd AS T 
     ) dist 
---------------------------------------------------------- 
    -- Variant 4, without using window function 
    SELECT T.DatabaseName, 
      T.TableName, 
      COUNT(DISTINCT T.ProcedureName) cnt 
    FROM #tmprmd AS T 
    GROUP BY T.DatabaseName,T.TableName 
+0

이어야합니다. 변형 4는 내가 편집하기 13 시간 전에 게시 한 답변입니다. 들여다 봤니? – Paparazzi

+0

@Blam, 예, 이전 upvote 함께, 당신이 objecion 있다면 나는 내 게시물에서 제거 할 수 있습니다. – Vasily