2017-08-02 42 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

相关问题