我在SQL声明中苦苦挣扎,并希望有人愿意指出我正确的方向。
下面是我的桌子照片:
正如你在这里看到的,我有一个名为'State'的专栏。基本上我想将与特定BuildID相关联的所有“State”分组,并在SQL输出的额外列中显示它们。
我很亲密,但并不完全在那里。
在下面的图片中是我用来尝试实现此目的的语句示例:
正如您在此处所看到的,它已完成SUM并添加了TotalTime并创建了我需要的额外列。但是,它不是将所有内容分组到一个记录中,而是为每个BuildID创建了2个额外的行。一个是'Running'状态的值,另一个是'Break'值的记录,另一个是两个状态包含值0的记录。
现在我想要它做的是将它分成每个BuildID的一条记录。就像我在下面添加的图片一样:
上图是我想要显示的记录的方式。但问题是我添加了WHERE [State] = Running,我知道这是错误的,但只是以此为例。正如您所看到的,“中断”列没有任何价值。
我希望这是有道理的,希望有人能指出我正确的方向吗?
以下是SQL小提琴http://sqlfiddle.com/#!3/7b6b9/2
的示例感谢您花时间阅读本文:)
答案 0 :(得分:3)
从CASE
移出你的SUM()OVER(PARTITION BY ...)select BuildID, Product, Program, Sum(Running) Running, Sum([Break]) [Break]
from (
SELECT Distinct BuildID, Product, Program,
Sum(Case when [State]='Running' Then TotalTime Else 0 END) OVER (Partition by [State], [BuildID]) Running,
Sum(Case when [State]='Break' Then TotalTime Else 0 END) OVER (Partition by [State], [BuildID]) [Break]
From Line1Log) T
group by BuildID, Product, Program
答案 1 :(得分:3)
稍微改进了sql,你走了:
SELECT BuildID,Product, Program,
sum(CASE WHEN State = 'Running' THEN cast(TotalTime as INT) ELSE 0 END) AS Running
, sum(CASE WHEN State = 'Break' THEN cast(TotalTime as INT) ELSE 0 END) AS Breakt
FROM Line1Log
GROUP BY BuildID,Product, Program
请检查SQLFiddle
不确定我是否遗漏了某些东西:-),但解决方案看起来非常简单。让我知道。
答案 2 :(得分:1)
其他一切都还可以,为什么要对所有列进行分组?,试试这个,
Select BuidId,Product,program,Sum(Running),Sum(Break)
(......
.....
......) as T
group by BuidId,Product,program