2017-02-10 44 views
2
集團

我不知道如何得到這個在SQL 2008檢查值對於給定

對於同一個郵政編碼有多個客戶端和具有RelationNo ,我試圖尋找失蹤的關係數 當同一個郵政編碼有兩個以上客戶數量以及這些客戶端中的任何一個電話號碼是相同的地方丟失或空或空白

如果電話號碼不存在NO ACTION 然後同行業數將被更新。

可能有人請建議如何在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|  |  | 

感謝

+0

您是否也可以顯示預期的輸出? –

+0

@vkp:我在輸出下顯示。 –

+0

如果添加'SELECT'KA48HH','E8888888',01290,'','G888'UNION ALL' ...會怎麼樣? – Serg

回答

1

使用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 |   | 
+--------+----------+--------+--------+------------+ 
+0

真的不需要cte。 '更新o設置RelationNo = FoundRelationNo從@MASTER作爲o ...' – Serg

+0

同意,這是矯枉過正。 – iamdave

+0

@iamdave肯定,因爲你編輯了問題,並刪除了「交易號碼將被更新的地方」這一行。 – SqlZim

1

這可以用一個簡單的applyunion all來完成:

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

INSERT @t 
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', 'E8888888', 01290, '', 'G888' 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', '', '', '' 

select t.POSTAL 
     ,t.CLIENT 
     ,t.phone1 
     ,t.phone2 
     ,tt.RelationNo 
from @t t 
    outer apply(select top 1 RelationNo 
       from @t t2 
       where t.POSTAL = t2.POSTAL 
        and t.CLIENT <> t2.CLIENT 
        and (nullif(t.phone1,0) in(t2.phone1,t2.phone2) 
         or nullif(t.phone2,0) in(t2.phone1,t2.phone2) 
         ) 
        and t2.RelationNo <> '' 
       ) tt 
where t.RelationNo = '' 

union all 

select * 
from @t 
where RelationNo <> '' 
order by 1; 

輸出:

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