根据列值(LIKE)将多行合并为一行

时间:2013-12-16 20:05:27

标签: sql sql-server

在我的表格中,我的数据如下:

incidents   custname   startdate   enddate      desc   
6           custA      11/11/2013  11/11/2014   prod1 mod1  
2           custA      11/11/2013  11/11/2014   prod1 mod2  
2           custA      11/11/2013  11/11/2014   prod1 mod3  
2           custA      11/11/2013  11/11/2014   prod1 mod4  
6           custA      11/11/2013  11/11/2014   prod2 mod1  
2           custA      11/11/2013  11/11/2014   prod2 mod2  
2           custA      11/11/2013  11/11/2014   prod2 mod3  
2           custA      11/11/2013  11/11/2014   prod2 mod4  

可能超过4,但为了简单起见,我们可以限制它。

现在我想做的是每个产品只选择一行,其中所有模块的事件数总和​​。所以例如我想要的输出应该是这样的:

incidents   custname   startdate   enddate      desc   
12          custA      11/11/2013  11/11/2014   prod1 all mods  
12          custA      11/11/2013  11/11/2014   prod2 all mods  

我知道该怎么做,或者我甚至可以做这样的事情。描述字段是一个文本字段(nvarchar),所以要获得产品,它需要使用LIKE甚至找出它是正确的产品?

所以问题是,这可能吗?如果可能的话,给我一个链接,我可以阅读有关如何实现这一目标的地方,我不知道从哪里开始......

谢谢!

1 个答案:

答案 0 :(得分:1)

将说明拆分为两个,以便按产品分组:

;WITH cte AS (
        SELECT incidents, custname, startdate, enddate
             , LEFT(descr, CHARINDEX(' ',descr)) AS prod
             , RIGHT(descr, CHARINDEX(' ',REVERSE(descr))) AS Prod_Mod
        FROM Table1
      )
SELECT SUM(incidents) AS Incidents
      ,custname
      ,startdate
      ,enddate
      ,prod
      ,COUNT(distinct Prod_Mod) AS Mod_Count
FROM cte
GROUP BY custname
        ,startdate
        ,enddate
        ,prod 

演示:SQL Fiddle

注意:如果产品跨越多个日期,您可能不希望对所有这些字段进行分组,例如,您可能需要最小/最大日期并将其从组中删除。

更新:听起来你需要更复杂的逻辑来拆分描述字段,考虑使用CASE语句:

CASE WHEN descr LIKE '%something%' THEN 'prod1'
     WHEN descr LIKE '%somethingelse%' THEN 'prod2'
     ....
     ELSE 'noprod'
END