2010-07-30 6 views
-1

테이블 tblOperationLog를 작성하고 사용자가 기본 테이블에서 행을 삭제, 업데이트 또는 삽입 할 때 입력 할 트리거를 작성했습니다. 그것은 삭제하고 하나를 삽입입니다 : 외부 조인을 사용하여 3 개의 쿼리를 결합했습니다.

CREATE TRIGGER FILL_TABLE 
ON Person FOR INSERT, DELETE 
AS 

    INSERT INTO tblOperationLog 
SELECT SYSTEM_USER, 
     'user has inserted a row with ID = ' + Convert(nvarchar, inserted.id), 
      'Insert', CURRENT_TIMESTAMP, getdate() 
    FROM inserted 


    INSERT INTO tblOperationLog 
SELECT SYSTEM_USER, 
     'user has deleted a row with ID = ' + Convert(nvarchar, deleted.id), 
      'Insert', CURRENT_TIMESTAMP, getdate() 
    FROM deleted 

가 지금은 각 사용자가 하루에 할 수있는 작업의 평균을 보여주기 위해 프로 시저를 작성하고자합니다. 별도의 열에서 각 작업의 평균 (삭제, 삽입 및 업데이트)을 원합니다. 이 목표를 달성하기 위해 다음 쿼리를 작성했습니다. 위의 절차를 사용하여 각 작업을 별도의 테이블에 표시합니다.

select A.Users , avg(A.[Number Of Inserts])as 'Number Of Inserts' from 
(select Users,[Time],COUNT(*) as 'Number Of Inserts' from tblOperationLog where Opertion='Insert' group by Users, [Date]) A group by Users 

go 
select B.Users , avg(B.[Number Of Updates])as 'Number Of Updates' from 
(select Users,[Date],COUNT(*) as 'Number Of Updates' from tblOperationLog where Operation='Update' group by Users, [Date]) B group by Users 

go 

select C.Users , avg(C.[Number Of Deletes])as 'Number Of Deletes' from 
(select Users,[Date],COUNT(*) as 'Number Of Deletes' from tblOperationLog where Operation='Delete' group by Users, [Date]) C group by Users 

Go 

그러나 나는 그것들을 하나의 테이블에 모두 담고 싶습니다. 나는 삭제 또는 ... 연산 0이없는 사용자를 평균값으로 갖고 싶습니다. 그들 모두와 함께 할 수있게 도와 주시겠습니까? 나는 완전히 외부 조인을 사용해야한다고 생각합니다. 그러나 매번 최종 쿼리에 오류가 있습니다. SQL Server를 사용합니다.

답변

0

"UNION"SQL 연산자를 찾으십시오.

+0

를 어떻게 그들과 합류하는, 내가 그것을 사용하는 나를 보여 pleaese 수 있습니다하지만 난 결과를 얻을 couldnt한다 – anna

+0

쿼리에서 열 이름이 같지 않아서 유니온이 작동하지 않습니다. – anna

0

다음은 작동하는 쿼리입니다.

WITH OpLogCTE AS (
    SELECT Users, Date, Operation, AVG(COUNT(*)) OVER (PARTITION BY Users, Date, Operation) AS OpCount 
    FROM tblOperationLog 
    GROUP BY Users, Date, Operation 
    ) 

SELECT Users, Date, 
    SUM(CASE Operation WHEN 'Insert' THEN OpCount ELSE 0 END) AS InsertCount, 
    SUM(CASE Operation WHEN 'Update' THEN OpCount ELSE 0 END) AS UpdateCount, 
    SUM(CASE Operation WHEN 'Delete' THEN OpCount ELSE 0 END) AS DeleteCount 
FROM OpLogCTE 
GROUP BY Users, Date 
ORDER BY Users, Date 

맨 위 부분은 공통 테이블 식 (CTE)입니다. 여기에는 각 사용자, 날짜 및 작업에 대한 평균 값을 가져 오는 쿼리가 들어 있습니다.

아래 부분은 CTE의 결과를 가져와 데이터를 그룹화하여 각 사용자 및 날짜에 대한 행을 가져옵니다.

0

이것이 필요한가요?

SELECT * 
INTO #tblOperationLog 
FROM (
SELECT 'Alice' AS Users, CAST('2010-07-29' AS DATE) AS [DATE], 
'Delete' AS OPERATION UNION ALL 
SELECT 'Bob' AS Users, CAST('2010-07-30' AS DATE) AS [DATE], 
'Insert' AS OPERATION UNION ALL 
SELECT 'Bob' AS Users, CAST('2010-07-30' AS DATE) AS [DATE], 
'Insert' AS OPERATION 
) DemoData 


DECLARE @DateCount float 
SELECT @DateCount= COUNT(DISTINCT [DATE]) FROM #tblOperationLog 

SELECT Users, 
COUNT(CASE WHEN OPERATION = 'Delete' THEN 1 END)/@DateCount AS DelAverage, 
COUNT(CASE WHEN OPERATION = 'Insert' THEN 1 END)/@DateCount AS UpdateAverage, 
COUNT(CASE WHEN OPERATION = 'Update' THEN 1 END)/@DateCount AS InsertAverage 
FROM #tblOperationLog 
GROUP BY Users 

출력 (각 사용자에 대한 각 작업의 평균 수를 계산하려고)

Users DelAverage    UpdateAverage   InsertAverage 
----- ---------------------- ---------------------- ---------------------- 
Alice 0.5     0      0 
Bob 0      1      0  
관련 문제