在SQL Server中基于作业ID合并行

在SQL Server中基于作业ID合并行,sql,sql-server,Sql,Sql Server,SQL使用SQL Server的新手。我有一个查询,它提取了我们在一组客户机上执行分析所需的所有信息,但根据系统的设置方式,目前需要在excel中手动清理,然后才能使用数据 有些作业ID以s结尾,但当我们进行分析时,我们将作业ID视为一个整体,必须花费大量时间在excel中手动将数据组合在一起 示例查询结果 JOB ID LABOR EXPENSE DIRECT MATERIAL 10067 400395.29 96614.25 10067S 143668

SQL使用SQL Server的新手。我有一个查询,它提取了我们在一组客户机上执行分析所需的所有信息,但根据系统的设置方式,目前需要在excel中手动清理,然后才能使用数据

有些作业ID以s结尾,但当我们进行分析时,我们将作业ID视为一个整体,必须花费大量时间在excel中手动将数据组合在一起

示例查询结果

JOB ID   LABOR EXPENSE  DIRECT MATERIAL
10067    400395.29      96614.25
10067S   143668         44148.22
10068    545100.79      127143.64
10068S   147009.89      33506.31
我想做的是,当查询运行时,将
作业ID
中带S的行组合成不带S的行,这样我们只为每个作业获取一行数据

范例

Job ID  LABOR EXPENSE   DIRECT MATERIAL
10067   544063.29       140762.47
10068   692110.68       160649.95
有人对我如何修改查询以实现这一点有什么想法吗?

试试这个:

select replace( Job_Id, 'S', '' ) as "JOB ID",
       sum (LABOR_EXPENSE) as "LABOR EXPENSE",
       sum (DIRECT_MATERIAL) as "DIRECT MATERIAL"
  from yourTable
group by replace( Job_Id, 'S', '' )
order by replace( Job_Id, 'S', '' ) 

请记住相应地更改列,因为它可能不是用空格定义的,甚至不是我建议的用下划线定义的。

主题的一种变体(如果您的id值与数字长度一致)是使用子字符串:

SELECT SUBSTRING(job_id,1,5) AS job_no, 
SUM(labor_exp) AS tot_lab,
SUM(direct_mat) AS tot_mat
FROM jobs
GROUP BY SUBSTRING(job_id,1,5)

SQLFiddle:

因为它是一个id,所以很可能大小不同,所以您可以在子字符串版本中使用从1到“s”字符减去1:)谢谢您!这也很有效。这也有助于解释以“冰”或“漏”而不是“s”结尾的工作。我只需要进行分析,看看是否有任何作业ID的长度大于或小于5个字符。
JobId
是否总是一个可能后跟“s”的数字?我还应该注意到,在Excel中使用透视表很容易做到这一点,但这是另一回事。有时,根据作业的不同,在透视表后面会出现“ICE”或“LEAK”。有时候,我们会有最初的工作,然后是所有三个子工作。谢谢你Jorge!这真是太棒了!如果我想修改SQL语句,同时对以“ICE”和“LEAK”结尾的作业执行replace,我该怎么做?然后可以使用
regexp\u replace
函数,如:
regexp\u replace(作业Id,'S | ICE | LEAK','')
在您的情况下,它会接收一个正则表达式:
'S | ICE | LEAK'
这意味着S或ICE或LEAK,但正则表达式函数在大量数据中执行不好替代方法是在replace中进行替换,如
replace(replace(replace(作业Id,'S','','ICE','','','LEAK','')
但这没有正则表达式优雅:)谢谢!我真的很感谢你的帮助。