首页 > 解决方案 > 在 SQL Server 中的组内传输特定信息

问题描述

我在重复检查公司名称后得到了结果,如下所示:

|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)

具体的:

有时在一个重复组中有超过 2 个条目-> 例如,有时 2 个具有(不同的)门牌号,而 1 个没有或如此...(当有不同的门牌号或/电话号码时,哪个是无关紧要的选择添加)

我不知道如何解决它;我只发现要测试,如果字符串中有一个数字:

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

我很感激任何帮助!

标签: sqlsql-servertsql

解决方案


您可以使用以下任何查询,具体取决于您的 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;

在此处输入图像描述


推荐阅读