2010-07-30 68 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告訴我如何加入他們的行列,我使用它,但我不能得到的結果 – anna 2010-07-30 15:02:43

+0

聯合不工作,因爲查詢中的列名不相同 – anna 2010-07-30 15:54:58

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