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