объединение 3 запросов с внешним соединением - PullRequest
0 голосов
/ 30 июля 2010

Я создал таблицу 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.

Ответы [ 3 ]

0 голосов
/ 30 июля 2010

Вот запрос, который может работать.

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 голосов
/ 30 июля 2010

Это то, что вам нужно? (Вы пытаетесь рассчитать среднесуточное количество каждой операции для каждого пользователя)

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    
0 голосов
/ 30 июля 2010

Посмотрите на оператор SQL "UNION"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...