sql - 在 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)
同一个重复组中有一个带有电话号码的条目时添加电话号码到没有电话号码的条目中(重复组2)
当在同一重复组中有一个具有门牌号和电话号码的条目时,添加(仅)门牌号和电话号码到没有门牌号和电话号码的条目(重复组 3)
具体的:
有时在一个重复组中有超过 2 个条目-> 例如,有时 2 个具有(不同的)门牌号,而 1 个没有或如此...(当有不同的门牌号或/电话号码时,哪个是无关紧要的选择添加)
我不知道如何解决它;我只发现要测试,如果字符串中有一个数字:
SELECT *
FROM table
WHERE Column LIKE '%[0-9]%'
我很感激任何帮助!
解决方案
您可以使用以下任何查询,具体取决于您的 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;
推荐阅读
- ruby-on-rails - 登录注销后网页一直重定向到上游服务器地址
- c# - 使用 C# 连接到 OpenLDAP 服务器
- ignite - org.apache.ignite.spi.discovery.zk.ZookeeperDiscoverySpi.spiStart(ZookeeperDiscoverySpi.java:446)
- vim - vi 编辑器不加载保存的宏
- javascript - 如何使您的复选框允许用户在 Jquery 的 CSV 文件中下载正确的数据?
- javascript - 如何读取 html 模板中的数据数组
- gstat - 是否可以在 R 中使用 gstat 进行各向异性 IDW 估计(和交叉验证)?
- .net - 通过 Visual Studio 停止程序时运行代码
- java - Log4j2 在尝试启动 Sonar Qube 本地实例时找不到日志记录实现
- angular - Angular 在动态加载时不解析 html 代码字符