SQL表-根据条件合并行

时间:2018-07-19 03:32:09

标签: sql sql-server join

我有一张类似的桌子

DateCol       TaskID     EventName
2017-09-25    10         A
2017-07-26    10         B
2017-07-27    10         A
2017-09-14    10         A
2017-07-25    10         B
2017-09-25    10         C
2017-09-28    11         A
2017-11-01    11         D
2017-11-01    11         C

.....数千行

我想要的是一个输出,对于每个TaskID,如果事件A和C(不是任何其他组合)在同一天(来自DateCol)发生,则EventName列为“ A + C”。所以在这种情况下,它将显示

DateCol       TaskID     EventName
2017-09-25    10         A+C
2017-07-26    10         B
2017-07-27    10         A
2017-09-14    10         A
2017-07-25    10         B
2017-09-28    11         A
2017-11-01    11         D
2017-11-01    11         C

您可以看到该行

2017-09-25    10         A

2017-09-25    10         C

现在是一行,

2017-09-25    10         A+C

但没有其他改变。

要进行这种调整,我需要做哪种SQL语句?

3 个答案:

答案 0 :(得分:2)

假设:仅将2个不同的EventName合并为1。

有点粗糙,但应该可以。

; with
cte as
(
    select  t.DateCol, t.TaskID, 
        t.EventName,
        new_EventName   = 
            case when   t.EventName in ('A')        
                 and    max(t.EventName) over (partition by t.DateCol, t.TaskID)    = 'C'
                 then   'A+C'
                 when   t.EventName in ('C')
                 and    min(t.EventName) over (partition by t.DateCol, t.TaskID)    = 'A'
                 then   'A+C'
                 else   NULL
                 end
    from    yourtable t
)
select  distinct DateCol, TaskID, EventName = coalesce(new_EventName, EventName)
from    cte 

如果还有其他情况不能解决问题,请发布带有预期结果的示例数据

答案 1 :(得分:0)

所以首先您需要为所有行添加一个主键/唯一列,然后我们找到在同一日期具有A和C的所有行。我们可以为此使用selfjoin。另外,我还假设TaskId A和C之间的EventName始终相同。

例如,如果表名是TableX而主键列是PrimaryX

Select A.DateCol, A.TaskID, 'A+C' AS EventName FROM TableX A INNER JOIN TableX B 
ON A.DateCol = B.DateCol AND (EventName ='A' OR EventName ='C')

然后,我们与普通查询合并,但普通查询不会从上一个查询中获取相同的数据。为此,我们可以在列PrimaryX

中使用not in
Select DateCol, TaskID, 'A+C' AS EventName FROM TableX A WHERE PrimaryX not in 
(Select A.PrimaryX  AS EventName FROM TableX A INNER JOIN TableX B 
ON A.DateCol = B.DateCol AND (EventName ='A' OR EventName ='C')) AND PrimaryX not in 
(Select B.PrimaryX  AS EventName FROM TableX A INNER JOIN TableX B 
ON A.DateCol = B.DateCol AND (EventName ='A' OR EventName ='C'))
UNION
Select A.DateCol, A.TaskID, 'A+C' AS EventName FROM TableX A INNER JOIN TableX B 
ON A.DateCol = B.DateCol AND (EventName ='A' OR EventName ='C')

答案 2 :(得分:0)

我相信最有效的方法是自我json.dumps

s

SQL Fiddle

相关问题