Sql server 使用外部联接联接3个查询

Sql server 使用外部联接联接3个查询,sql-server,join,Sql Server,Join,我创建了一个表tblOperationLog,并在用户删除、更新或插入主表中的行时编写触发器来填充它。 这是删除和插入一个: 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, ins

我创建了一个表tblOperationLog,并在用户删除、更新或插入主表中的行时编写触发器来填充它。 这是删除和插入一个:

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。

看看“UNION”SQL操作符

这里有一个可能有效的查询

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的结果并对数据进行分组,以便为每个用户和日期获得一行。

这就是您需要的吗?(您是否试图计算每个用户每天的平均操作次数)

输出

Users DelAverage             UpdateAverage          InsertAverage
----- ---------------------- ---------------------- ----------------------
Alice 0.5                    0                      0
Bob   0                      1                      0    

你能告诉我如何连接它们吗?我使用了它,但我无法得到结果。由于查询中的列名不同,所以连接不起作用
Users DelAverage             UpdateAverage          InsertAverage
----- ---------------------- ---------------------- ----------------------
Alice 0.5                    0                      0
Bob   0                      1                      0