2010-07-30 73 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