【问题标题】:joining 3 queries with outer join用外连接连接 3 个查询
【发布时间】:2010-07-30 14:03:38
【问题描述】:

我创建了一个表 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。

【问题讨论】:

    标签: sql-server join


    【解决方案1】:

    查看“UNION”SQL 运算符

    【讨论】:

    • 你能告诉我如何加入他们吗,我使用它但我无法得到结果
    • 联合不起作用,因为查询中的列名不同
    【解决方案2】:

    这是一个可能有效的查询。

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

    【讨论】:

      【解决方案3】:

      这是你需要的吗? (你是不是要计算每个用户每天的平均操作次数)

      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    
      

      【讨论】:

        猜你喜欢
        • 2011-12-21
        • 2020-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-25
        • 1970-01-01
        • 1970-01-01
        • 2023-04-09
        相关资源
        最近更新 更多