合并特定列中具有相同值的行

时间:2018-11-05 13:35:55

标签: sql sql-server tsql

所以我有一个表,该表记录了名为dbo.card_history的用户的卡号更改:

 |  id  |  name  |  card_no  |  card_state  |        change_time        |
 |  1   |  Ami   |   11111   |       1      |  2018-11-05 21:11:06.117  |

如果我从另一个名为dbo.card的表中修改了该用户的卡号,则dbo.card历史记录将自动生成另外2个新行,现在将如下所示:

 |  id  |  name  |  card_no  |  card_state  |        change_time        |
 |  1   |  Ami   |   11111   |       1      |  2018-11-05 21:11:06.117  |
 |  2   |  Ami   |   11111   |      13      |  2018-11-05 21:11:21.953  |
 |  3   |  Ami   |   22222   |       1      |  2018-11-05 21:11:21.953  |

基本上,它将记录旧行,但card_state为13,并生成一个新行,其中更新值和card_state为1

另外,如果我删除卡的值,它将生成一个新行,其中包含旧行的记录,但card_state为12,所以现在看起来像这样:

 |  id  |  name  |  card_no  |  card_state  |        change_time        |
 |  1   |  Ami   |   11111   |       1      |  2018-11-05 21:11:06.117  |
 |  2   |  Ami   |   11111   |      13      |  2018-11-05 21:11:21.953  |
 |  3   |  Ami   |   22222   |       1      |  2018-11-05 21:11:21.953  |
 |  4   |  Ami   |   22222   |      12      |  2018-11-05 21:16:09.397  |

我想做的是查询,返回的内容如下:

 |  id  |  name  |  card_no  |  card_state  |        change_time        |    old_card_no   |
 |  1   |  Ami   |   11111   |       1      |  2018-11-05 21:11:06.117  |        NULL      |
 |  2   |  Ami   |   22222   |       1      |  2018-11-05 21:11:21.953  |       11111      |
 |  3   |  Ami   |   22222   |      12      |  2018-11-05 21:16:09.397  |        NULL      |

我想合并具有相同change_time的行,以便card_state为13的行的card_no将在称为old_card_no的新行中返回

我尝试过这样的查询:

SELECT P.id, P.name, P.card_no, P.card_state, P.change_time, 
       MIN(CASE WHEN P.card_state != 1 then P.card_no END) AS old_card_no
FROM [dbo].[card_history] P 
GROUP BY P.pin, P.name, P.last_name, P.card_no, P.change_time, P.card_state

这将返回:

 |  id  |  name  |  card_no  |  card_state  |        change_time        |    old_card_no   |
 |  1   |  Ami   |   11111   |       1      |  2018-11-05 21:11:06.117  |        NULL      |
 |  2   |  Ami   |   11111   |      13      |  2018-11-05 21:11:21.953  |       11111      |
 |  3   |  Ami   |   22222   |       1      |  2018-11-05 21:11:21.953  |        NULL      |
 |  4   |  Ami   |   22222   |      12      |  2018-11-05 21:16:09.397  |       22222      |

对不起,我是一个新手,我意识到这里一定缺少明显的东西,但是我已经坚持了很长时间,需要帮助; m;

2 个答案:

答案 0 :(得分:1)

一种相当简单的方法是使用子查询:

SELECT id, name, card_no, card_state, change_time,
       (select card_no
        from [dbo].[card_history] t1
        where card_state = 13
        and t0.name = t1.name
        and t0.change_time = t1.change_time
        ) as old_card_no
FROM [dbo].[card_history] t0
WHERE card_state != 13

答案 1 :(得分:0)

如果我没听错,您想合并与某些列名匹配的2行,为此,您可以将GROUP BY与Max或Min结合使用,例如:“ SELECT ex1,ex2,Max(change_time)作为change_time,... .. FROM表GROUP BY的东西”