2013-10-11 48 views
2

我很難搞清楚我正在處理的SQL查詢的最後部分。我有一對我需要從中提取數據的表。一個表格包含無線接入點的UID和其可讀的名稱(假設0.38.153.35.118.16具有AP-9999-9-NW的人類可讀名稱)。另一個包含數千行輪詢數據,每行包含該輪詢的時間戳,接入點的UID以及連接的客戶端數量。SQL Group By創建列?

的原始數據是這樣的:

DateTime      AP Name     Clients 
2013-10-09 18:35:23.417  0.38.153.35.118.16.0  3 
2013-10-09 18:35:23.417  0.38.153.35.118.16.1  14 
2013-10-09 18:35:23.417  0.38.203.128.91.224.0  7 
2013-10-09 18:35:23.417  0.38.203.128.91.224.1  1 

然而,每個接入點都有,我們要合併成一個結果兩個無線電,從而加入.0和0.1每個UID。這提出了兩個問題;我必須以某種方式結合每條線的兩個結果。其次,我必須使用SUBSTRING刪除最後兩個字符,並通過聯接將UID結尾到另一個表,但這樣做會丟棄最後兩個字符。考慮到所有這一切,我有以下查詢:

SELECT 
    CAST([SolarWindsOrion].[dbo].[CustomPollerStatistics_Detail].[DateTime] AS datetime) AS DateTime, 
    'AP Name' = SUBSTRING([SolarWindsOrion].[dbo].[CustomPollerStatistics_Detail].[RowID], 1, LEN([SolarWindsOrion].[dbo].[CustomPollerStatistics_Detail].[RowID]) - 2), 
    [SolarWindsOrion].[dbo].[CustomPollerStatistics_Detail].[RawStatus] AS Clients 
FROM 
    [SolarWindsOrion].[dbo].[CustomPollerStatistics_Detail] 
INNER JOIN 
    [SolarWindsOrion].[dbo].[CustomPollerStatus] 
     ON Left([SolarWindsOrion].[dbo].[CustomPollerStatistics_Detail].[RowID], Len([SolarWindsOrion].[dbo].[CustomPollerStatistics_Detail].[RowID]) - 2) = [SolarWindsOrion].[dbo].[CustomPollerStatus].[RowID] 
WHERE 
    [SolarWindsOrion].[dbo].[CustomPollerStatistics_Detail].[CustomPollerAssignmentID] = '6C4E621B-A7D3-439C-8402-D692BE67743A' 

這就是我的思想融化的地方。這一切確實是從AP名稱爲兩個尾部字符:

DateTime      AP Name     Clients 
2013-10-09 18:35:23.417  0.38.153.35.118.16   3 
2013-10-09 18:35:23.417  0.38.153.35.118.16   14 
2013-10-09 18:35:23.417  0.38.203.128.91.224  7 
2013-10-09 18:35:23.417  0.38.203.128.91.224  1 

這讓我更接近,但連接是什麼都不做,我還是希望他們分享像AP名稱的行結合起來。 Group By似乎是最有用的選擇,但我似乎無法弄清楚如何在專門爲結果創建的列上使用它。最終目標是得到這樣的東西:

DateTime      AP Name    Clients 
2013-10-09 18:35:23.417  AP-9999-9-NW   17 
2013-10-09 18:35:23.417  AP-1234-5-SC   8 

任何想法?對不起,可能提供了太多的信息。

+0

'(假設0.38.153.35.118.16有一個人類可讀的AP-9999-9-NW名稱)「他們在哪裏? –

+0

@hamlet這些名稱位於CustomPollerStatus表(或[SolarWindsOrion]。[dbo]。[CustomPollerStatus])中。 –

回答

1

我通常不會走樣表名的粉絲,但你的代碼只是尖叫吧:)

這是一個很難理解你期待作爲輸出,該解決方案假定你想要的每個DateTime和AP的組合的客戶總數。

SELECT 
    Detail.[DateTime], 
    -- you didn't tell us the name of this column 
    Status.[YOUR HUMAN READABLE NAME], 
    SUM(Detail.[RawStatus]) AS Clients 
FROM 
    [SolarWindsOrion].[dbo].[CustomPollerStatistics_Detail] 
     AS Detail 
    INNER JOIN [SolarWindsOrion].[dbo].[CustomPollerStatus] 
     AS Status 
     ON Left(Detail.[RowID], Len(Detail.[RowID]) - 2) = Status.[RowID] 
WHERE 
    Detail.[CustomPollerAssignmentID] = '6C4E621B-A7D3-439C-8402-D692BE67743A' 
GROUP BY 
    Detail.[DateTime], 
    Status.[YOUR HUMAN READABLE NAME] 
+1

在使用別名後,您可以使用我的查詢來壓縮多少。 (在我的防守中,我從字面上學習了昨天的一半功能,所以我不是DBA,但仍然是哇)。人類可讀的狀態名稱是(奇怪的)狀態,所以它的狀態。狀態,這似乎工作。至少我得到了結果。仍在驗證數據與原始數據。 –

+2

看起來像我能找到的一切正在驗證。感謝您的回答,並感謝您以這樣的方式編寫它,即使我在SQL查詢方面幾乎完全缺乏經驗,也能理解它的作用。 –

1

因此,首先,我建議您使用別名來簡化您的代碼。

from 
    [SolarWindsOrion].[dbo].[CustomPollerStatistics_Detail] cpsd 
    join [SolarWindsOrion].[dbo].[CustomPollerStatus] cps on cps.[RowID] = left(cpsd.[RowID], len(cpsd.[RowID]) - 2) 

一旦你這樣做,它變得輕鬆了許多,看你需要做什麼:

  1. 做你已經做
  2. 加入到CustomPollerStatus表中的「左」操作使用的AP名稱

這裏所得到的值

  • 集團的我想出了代碼:

    select 
        cast(cpsd.[DateTime] as datetime) as DateTime 
        , cps.[Whatever is the AP Name column name] 
        , cpsd.[RawStatus] as Clients 
    from 
        [SolarWindsOrion].[dbo].[CustomPollerStatistics_Detail] cpsd 
        join [SolarWindsOrion].[dbo].[CustomPollerStatus] cps on cps.[RowID] = left(cpsd.[RowID], len(cpsd.[RowID]) - 2) 
    where 
        cpsd.[CustomPollerAssignmentID] = '6C4E621B-A7D3-439C-8402-D692BE67743A' 
    group by 
        cast(cpsd.[DateTime] as datetime) 
        , cps.[Whatever is the AP Name column name] 
        , cpsd.[RawStatus] 
    
  • +0

    當然,如果您想要統計客戶的數量,只需將其更改爲總和,然後將其從組中除去。 – eequalsmcaputo

    +1

    謝謝你的回答。你和Jan基本上在同一時間提供了同樣的答案,儘管我只嘗試過Jan's,但看起來你的工作也會如此。 –

    +0

    謝謝。 upvote怎麼樣? – eequalsmcaputo