2017-08-02 24 views
0

初學者。所以,我想取一個數據集像如何在case語句中使用子字符串以篩選兩個特定類別並將所有其他類別分組在一個類別中

Id, Name, Team, Games, PPG 
1, Joe Smith, Wolves, 5, 14.1 
2, Mike Bender, Bears, 6, 7.1 
3, Jordan Shoeheart, Blazers, 5, 9.0 
4, Sara Eckert, Tigers, 5, 4.1 
5, Jason Beard, Bears, 6, 22.1, 
6, Noel Redding, Wolves, 4, 1.5 
7, Jared Herring, Wolves, 6, 5.5 
8, Jennifer Bradley, Bears, 4, 3.2 
9, Erica Medley, Tigers, 5, 8.3 
10, Justin Awesome, Sharks, 6, 0.3 

和回答這個問題,怎麼算爲熊多少實例(記錄),有多少對狼隊,又有多少在TSQL所有其他球隊。我需要使用子字符串,因爲數據有各種格式(有時候開始或結束時會有額外的字符)。我很困惑,因爲我需要與鍵值對,最終會是這個樣子:

Key  | Value 
----------------- 
Wolves  | 3 
Bears  | 3 
All Others | 4 

我已經試過類似:

SELECT CASE WHEN tbl.team LIKE '%Wolves%' THEN COUNT(tbl.id) end as [Value], 
     CASE WHEN tbl.team LIKE '%Wolves%' THEN 'Wolves' END AS [Key] 
     -- this isn't right because I couldn't at least get the values for the others right? 

我學習,所以我感謝幫助

+0

當您結束重疊的項目時,例如「茶」和「蒸汽」,事情會變得更有趣。你需要分開單詞進行處理。 – HABO

回答

3

這應該做的伎倆......

IF OBJECT_ID('tempdb..#TestData', 'U') IS NOT NULL 
DROP TABLE #TestData; 

CREATE TABLE #TestData (
    Id INT NOT NULL PRIMARY KEY, 
    Name VARCHAR(50) NOT NULL, 
    Team VARCHAR(50) NOT null, 
    Games INT NOT NULL, 
    PPG DECIMAL(9,2) NOT NULL 
    ); 
INSERT #TestData (Id, Name, Team, Games, PPG) VALUES 
    (1, 'Joe Smith', 'Wolves', 5, 14.1), 
    (2, 'Mike Bender', 'Bears', 6, 7.1), 
    (3, 'Jordan Shoeheart', 'Blazers', 5, 9.0), 
    (4, 'Sara Eckert', 'Tigers', 5, 4.1), 
    (5, 'Jason Beard', 'Bears', 6, 22.1), 
    (6, 'Noel Redding', 'Wolves', 4, 1.5), 
    (7, 'Jared Herring', 'Wolves', 6, 5.5), 
    (8, 'Jennifer Bradley', 'Bears', 4, 3.2), 
    (9, 'Erica Medley', 'Tigers', 5, 8.3), 
    (10, 'Justin Awesome', 'Sharks', 6, 0.3); 

--================================================== 

SELECT 
    gn.GroupName, 
    PlayerCount = COUNT(1) 
FROM 
    #TestData td 
    CROSS APPLY (VALUES (CASE WHEN td.Team IN ('Bears', 'Wolves') THEN td.Team ELSE 'All Others' END)) gn (GroupName) 
GROUP BY 
    gn.GroupName; 

結果...

GroupName PlayerCount 
---------- ----------- 
All Others 4 
Bears  3 
Wolves  3 

編輯......(展示如何「模糊「相匹配的隊名)

SELECT 
    gn.GroupName, 
    PlayerCount = COUNT(1) 
FROM 
    #TestData td 
    CROSS APPLY (VALUES (CASE 
           WHEN td.Team LIKE '%Bears%' THEN 'Bears' 
           WHEN td.Team LIKE '%Wolves%' THEN 'Wolves' 
           ELSE 'All Others' 
          END)) gn (GroupName) 
GROUP BY 
    gn.GroupName; 

HTH,傑森

+0

謝謝傑森,這幾乎是我所需要的,並幫助噸!只需弄清楚'喜歡'/通配符子位,我很好。再次感謝! – Justin

+0

沒問題。樂意效勞。使用您發佈的數據,不需要LIKE/WildCards,但是我繼續並添加了一個編輯,以顯示如果您必須這樣做的話。 –

+0

正是我所需要的。非常感謝 – Justin

0

根據您的需要,您關心的是每個團隊的人數。有一個稱爲TRIM的功能,它負責刪除文本列兩側的多餘空格。你可以做

SELECT COUNT(1) AS Instances, TRIM(t.Team) AS team_without_extra_spaces 
FROM mytable t 
GROUP BY TRIM(t.Team) 

注意:如果你使用的是Oracle,Mysql或者Postgres,那麼這個就行了。如果您使用的是SQL Server,則必須執行LTRIM(左修剪)和RTRIM(右修剪),如LTRIM(RTRIM(t.Team))。

不知道你是如何的初學者,所以GROUP BY將所有具有相同價值的行集合在一起,在這種情況下,你說的是按團隊分組,所有熊,所有狼等成爲一個組,那麼COUNT(1)只給你每組的計數。希望它是有道理的!你可以在這裏閱讀更多關於組:https://www.w3schools.com/sql/sql_groupby.asp

相關問題