2016-07-31 96 views
0

我有以下表格:MS SQL加入/數查詢

會議

  • ID(INT)
  • 用戶ID(INT)
  • 開始(日期時間)
  • 停止(日期時間)

用戶

  • ID(INT)
  • 用戶名(爲nvarchar(200))

日誌

  • 的SessionID(INT)
  • LogLevelId(INT)
  • 時間戳(日期時間)
  • 消息(varchar(max))

記錄級

  • ID(INT)
  • DisplayText(VARCHAR(5))

我想是的輸出,顯示與會話列表概述以下欄目:

SessionId | Username | Start | Stop | [total number of logs from each log level] 

我有哪裏在C#中的解決方案我:

  1. 選擇所有的日誌級別和其相關的顯示文本
  2. 獲取使用下面的查詢所有會話的列表:

-

SELECT [Sessions].[Id] 
     ,[Username] 
     ,[Start] 
     ,[Stop] 
     ,[Application] 
    FROM [Sessions] 
    JOIN [Users] ON [Users].[Id] = [UserId] 
  • 我循環遍歷來自步驟1的每個結果以組裝一個查詢來計算每個可能的日誌級別。然後根據步驟2中的結果執行查詢,在末尾放置一個where子句以基於特定會話進行篩選。其中每個查詢都看起來像下面這樣:
  • -

    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| 
    

    我知道這是不是最佳的解決方案,我不知道它如何可以讓我拉所有這些信息在一個查詢或兩個查詢而不是兩個查詢+ N,其中N是會話行的總數。

    回答

    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 
    
    +0

    [Fiddled(MySQL)](http://sqlfiddle.com/#!9/51544c/1) – OGHaza

    +0

    這是完美的!我不知道你可以這樣做。有沒有辦法我也可以合併日誌表的ID和DISPLAYNAME。每個「COUNT(CASE t。[LogLevelId] WHEN 1 THEN 1 END)AS'Debugs'」行實際上是LogLevel的Id和DisplayName。 – Dex

    +0

    子查詢不是必需的。 –