Fun*_*Guy 2 sql-server t-sql sql-server-2008-r2
我想使用 case 语句总结一些值。我的问题是编译器会抱怨,如果我没有在查询的末尾添加一个组,这会否定我的 Distinct,哈哈。例如,在我下面的示例中,red12即使 1 个条目不符合上述任何条件,这也会返回 2 个条目,但这让Group By我感到困惑!我怎样才能运行这个查询并只返回适用的结果,即case statements显示什么?
Create Table #Bobsled
(
[event] varchar(100)
,[time] decimal(18,4)
,employeeID varchar(25)
,name varchar(500)
)
Insert Into #Bobsled Values
('Walk', '16.32','red12', 'red arrow')
,('Eat', '5.12', 'red12', 'red arrow')
,('Run', '32.13','pink01', 'pink pig')
,('Walk', '2.12', 'bl81', 'blue fire')
,('Sleep', '8.12', 'gr99', 'green pony')
Select Distinct
employeeid
,case when [event] = 'Walk' then SUM([time]) else 0 end as walktime
,case when [event] = 'RUN' then SUM([time]) else 0 end as runtime
,case when [event] = 'Sleep' then SUM([time]) else 0 end as sleeptime
FROM #Bobsled
--only executes sucesfully with this
GROUP BY employeeID, [event]
Run Code Online (Sandbox Code Playgroud)
我认为你在寻找什么是对聚集employeeID在那里的CASE云内的SUM()聚合函数。
SELECT employeeid,
SUM((CASE WHEN [event] = 'Walk' THEN [time] ELSE 0 END)) AS walktime,
SUM((CASE WHEN [event] = 'RUN' THEN [time] ELSE 0 END)) AS runtime,
SUM((CASE WHEN [event] = 'Sleep' THEN [time] ELSE 0 END)) AS sleeptime
FROM #Bobsled
GROUP BY employeeID;
Run Code Online (Sandbox Code Playgroud)
这样,每个员工 ID 都会得到一个结果行,基本上以事件为中心。