在SQL Server中的组内传输特定信息

时间:2018-09-07 09:15:06

标签: sql sql-server tsql

重复检查公司名称后,我得到了结果:

|customernumber|duplicate group |companyname|street   |telephone| 
|1             |1               |ABC group  |Alpha 112|017887   |
|3             |1               |ABC group  |Alpha    |017887   |
|4             |2               |DEF group  |Beta  223|034887   |
|7             |2               |DEF group  |Beta  112|017555   |
|9             |3               |GHI group  |Gamma 007|016386   |
|19            |3               |GHI group  |Gamma 007|         |
|5             |4               |JKL group  |DELTA 007|026386   |
|6             |4               |JKL group  |DELTA    |         |

我想要这个结果:

|customernumber|duplicate group |companyname|street   |telephone| 
|1             |1               |ABC group  |Alpha 112|017887   |
|3             |1               |ABC group  |Alpha 112|017887   |
|4             |2               |DEF group  |Beta  223|034887   |
|7             |2               |DEF group  |Beta  112|017555   |
|9             |3               |GHI group  |Gamma 007|016386   |
|19            |3               |GHI group  |Gamma 007|016386   |
|5             |4               |JKL group  |DELTA 007|026386   |
|6             |4               |JKL group  |DELTA 007|026386   |

规则:

  1. 当在同一重复组中有一个具有门牌号的条目时,将(仅)门牌号添加到没有门号的条目中(重复组1)

  2. 如果在同一重复组中有一个具有电话号码的条目,则将电话号码添加到没有电话号码的条目中(重复组2)

  3. 当在同一重复组中有一个具有门号和电话号码的条目时,将(仅)门号和电话号码添加到没有门号和电话号码的条目中(重复组3)< / p>

具体:

有时,重复组中有2个以上的条目->例如有时2个(不同的)门牌号和1个左右的门牌……(当有不同的门牌号或电话号码时,选择添加哪个都无所谓)

我不知道如何解决;我只是发现要测试的是,字符串中是否有数字:

SELECT * 
FROM table 
WHERE Column LIKE '%[0-9]%'

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

您可以使用以下任何查询,具体取决于您的SQL Server版本。这个想法是在字符串上使用MAX来获得more completed(更长),因为比较符号时每个符号都比空字符串大,然后再为空字符串。

DECLARE @DataSource TABLE
(
    [customernumber] INT
   ,[duplicate group] INT
   ,[companyname] VARCHAR(128)
   ,[street] VARCHAR(256)
   ,[telephone] VARCHAR(32)
);

INSERT INTO @DataSource ([customernumber], [duplicate group], [companyname], [street], [telephone])
VALUES (1, 1, 'ABC group', 'Alpha 112', '017887')
      ,(3, 1, 'ABC group', 'Alpha', '017887')
      ,(4, 2, 'DEF group', 'Beta  223', '034887')
      ,(7, 2, 'DEF group', 'Beta  112', '017555')
      ,(9, 3, 'GHI group', 'Gamma 007', '016386')
      ,(19, 3, 'GHI group', 'Gamma 007', '')
      ,(5, 4, 'JKL group', 'DELTA 007', '026386')
      ,(6, 4, 'JKL group', 'DELTA', '');


WITH DataSource AS
(
    SELECT [duplicate group]
          ,MAX([street]) AS [street]
          ,MAX([telephone]) AS [telephone]
    FROM @DataSource
    GROUP BY [duplicate group]
)
SELECT DS.[customernumber]
      ,DS.[duplicate group]
      ,DS.[companyname]
      ,CASE WHEN DS.[street] NOT LIKE '%[0-9]%' THEN CTE.[street] ELSE DS.[street] END AS [street]
      ,CASE WHEN DS.[telephone] = '' THEN CTE.[telephone] ELSE DS.[telephone] END AS [telephone]
FROM @DataSource DS
INNER JOIN DataSource CTE
    ON DS.[duplicate group] = CTE.[duplicate group];

SELECT [customernumber]
      ,[duplicate group]
      ,[companyname]
      ,IIF([street] NOT LIKE '%[0-9]%', MAX([street]) OVER(PARTITION BY [duplicate group]), [street]) AS [street]
      ,IIF([telephone] = '', MAX([telephone]) OVER(PARTITION BY [duplicate group]), [telephone]) AS [telephone]
FROM @DataSource;

enter image description here