使用 Distinct 和 Sum?

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)

Dan*_*her 5

我认为你在寻找什么是对聚集employeeID在那里的CASESUM()聚合函数。

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 都会得到一个结果行,基本上以事件为中心。