我有以下表格:
会话
用户
日志
记录级
我想要的是一个输出,它显示了包含以下列的会话列表的概述:
SessionId | Username | Start | Stop | [total number of logs from each log level]
我在C#I中有一个解决方案:
-
SELECT [Sessions].[Id]
,[Username]
,[Start]
,[Stop]
,[Application]
FROM [Sessions]
JOIN [Users] ON [Users].[Id] = [UserId]
-
SELECT
COUNT(CASE [Logs].[LogLevelId] WHEN 1 THEN 1 END) AS 'Debugs'
,COUNT(CASE [Logs].[LogLevelId] WHEN 2 THEN 1 END) as 'Infos'
,COUNT(CASE [Logs].[LogLevelId] WHEN 3 THEN 1 END) as 'Warnings'
,COUNT(CASE [Logs].[LogLevelId] WHEN 4 THEN 1 END) as 'Errors'
,COUNT(CASE [Logs].[LogLevelId] WHEN 5 THEN 1 END) as 'Fatals'
FROM [Logs]
WHERE [SessionId] = |C# SESSION ID HERE|
我知道这不是一个最佳解决方案,我想知道如何在单个查询或两个查询中提取所有这些信息而不是2个查询+ N,其中N是总数会话行。
答案 0 :(得分:3)
考虑在聚合GROUP BY
查询中将后一个查询加入以前的查询。
SELECT l.SessionId
, u.Username
, s.Start
, s.Stop
, COUNT(CASE WHEN l.[LogLevelId] = 1
AND lvl.DisplayText = 'Debugs' THEN 1 END) AS 'Debugs'
, COUNT(CASE WHEN l.[LogLevelId] = 2
AND lvl.DisplayText = 'Infos' THEN 1 END) as 'Infos'
, COUNT(CASE WHEN l.[LogLevelId] = 3
AND lvl.DisplayText = 'Warnings' THEN 1 END) as 'Warnings'
, COUNT(CASE WHEN l.[LogLevelId] = 4
AND lvl.DisplayText = 'Errors' THEN 1 END) as 'Errors'
, COUNT(CASE WHEN l.[LogLevelId] = 5
AND lvl.DisplayText = 'Fatals' THEN 1 END) as 'Fatals'
FROM
[Sessions] s
JOIN [Users] u ON u.[Id] = s.[UserId]
JOIN [Logs] l ON l.[SessionId] = s.[Id]
JOIN [LogLevels] lvl ON lvl.[Id] = l.[LogLevelId]
GROUP BY l.[SessionId]
, u.Username
, s.Start
, s.Stop