sql - 检查给定组的多列中的值

标签 sql sql-server

我不知道如何在 SQL 2008 中得到这个

对于同一个邮政编码,有多个客户端并且具有 RelationNo 我正在尝试查找丢失的关系号码 当同一邮政编码有两个或多个客户号码且这些客户的任何一个电话号码相同时 那么相同的交易号将在缺失、NULL 或空白的地方更新

如果电话号码不存在,则不执行任何操作。

有人可以建议如何在sql中执行

表:

DECLARE @MASTER TABLE
(
POSTAL VARCHAR (50),
CLIENT VARCHAR (50),
phone1 INT,
phone2 INT,
RelationNo VARCHAR (50)
)

INSERT @MASTER




SELECT 'M169HE',    'E5017766',016187,88888,'E100' UNION ALL
SELECT 'M169HE',    'M0111136', '', 016187, '' UNION ALL
SELECT 'IV11UF',    'E3009949', 50505,  '', 'F200' UNION ALL
SELECT 'KA48HH',    'E3087713', 01290,  '', '' UNION ALL
SELECT 'KA48HH',    'E3017126', 55665,  01290,  'G999' UNION ALL
SELECT 'KA48HH',    'E5005326', '', 55665,  '' UNION ALL
SELECT 'YO72LZ',    'C5640095', '', '', 'T8888' UNION ALL
SELECT 'YO72LZ',    'C5640096', '', '', '' 

输出:

POSTAL| CLIENT  |phone1  |  phone2| RelationNo
M169HE| E5017766|16187   |88888   |E100
M169HE| M0111136|        |16187   |E100
IV11UF| E3009949|   50505|        |F200
KA48HH| E3087713|   1290 |        |G999
KA48HH| E3017126|   55665|1290    |G999
KA48HH| E5005326|        |55665   |G999
YO72LZ| C5640095|        |  T8888 |
YO72LZ| C5640096|        |        |

谢谢

最佳答案

使用cross apply里面 common table expression查找并更新那些缺少 RelationNo 的行的匹配 RelationNo:

测试设置:http://rextester.com/YARZ79913

;with cte as (
  select o.*, x.FoundRelationNo
    from @MASTER as o
    cross apply (
      select top 1 FoundRelationNo = i.RelationNo 
        from @MASTER  as i
        where i.Postal = o.Postal
          and nullif(i.relationno,'') is not null
          and (
             nullif(i.phone1,0) in (o.phone1, o.phone2)
          or nullif(i.phone2,0) in (o.phone1, o.phone2)
              )
        ) as x
    where nullif(o.relationno,'') is null
     and (o.phone1 > 0 or o.phone2 > 0)
 )
 --select * from cte
 update cte set RelationNo = FoundRelationNo

 select * from @MASTER

结果:

+--------+----------+--------+--------+------------+
| POSTAL |  CLIENT  | phone1 | phone2 | RelationNo |
+--------+----------+--------+--------+------------+
| M169HE | E5017766 |  16187 |  88888 | E100       |
| M169HE | M0111136 |      0 |  16187 | E100       |
| IV11UF | E3009949 |  50505 |      0 | F200       |
| KA48HH | E3087713 |   1290 |      0 | G999       |
| KA48HH | E3017126 |  55665 |   1290 | G999       |
| KA48HH | E5005326 |      0 |  55665 | G999       |
| YO72LZ | C5640095 |      0 |      0 | T8888      |
| YO72LZ | C5640096 |      0 |      0 |            |
+--------+----------+--------+--------+------------+

关于sql - 检查给定组的多列中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42161105/

相关文章:

php - 错误 :Not storing ID in DataBase

mysql - 缓慢的 MySQL 查询/大型数据库/连接

java - 在测试之间重新设置 H2 数据库(即将 DB 重置为我的 SQL 文件)

c# - asp.net 4.5 MVC SQL 选择喜欢

php - php和mysql如何选择没有提交记录的用户?

sql-server - 我如何检查sql server 'views'依赖关系

sql - 在sql server中将列类型从Char更改为Varchar

sql-server - 关于创建日期和修改日期列的问题 - SQL Server

asp.net - 模式比较时如何忽略数据丢失警告?

sql-server - 从 Visual Studio 将 DB 与 Azure MFA 连接以将项目解决方案与 Azure DB 进行比较?