SQL查询组(按包含)
是否有人可以帮助修改以下SQL脚本,以便我能够执行分组并替换字符(null) 目前我有两张桌子: 表1SQL查询组(按包含),sql,sql-server,Sql,Sql Server,是否有人可以帮助修改以下SQL脚本,以便我能够执行分组并替换字符(null) 目前我有两张桌子: 表1 PK_LOYALTYACCOUNT COUNTRY_ID CDC_TYPE int varchar(50) varchar(50) 666 DE U 98 DE U 27975373 DE
PK_LOYALTYACCOUNT COUNTRY_ID CDC_TYPE
int varchar(50) varchar(50)
666 DE U
98 DE U
27975373 DE U
666 DE N
表2
PK_LOYALTYACCOUNT COUNTRY_ID CDC_TYPE
int varchar(50) varchar(50)
666 DE U
75 DE U
27975370 DE U
578 WE N
54 RT N
sql脚本的结果生成下表:
is_deleted PK_LOYALTYACCOUNT COUNTRY_ID CDC_TYPE
int int varchar(50) varchar(50)
1 666 DE U
0 666 DE U
(null) 769 DE U
(null) 578 WE N
(null) 54 RT N
但是,我希望按表分组(以任何方式),并删除或替换空值,以便表显示如下内容:
COUNTRY_ID CDC_TYPE PK_LOYALTYACCOUNT is_deleted
DE U 666 1
DE U 666 0
RT N 54 replace null
WE N 578 replace null
DE N 769 replace null
with cmn as
( SELECT a.CDC_TYPE,
a. PK_LOYALTYACCOUNT, --Add these also in CTE result set
a.COUNTRY_ID --Add these also in CTE result set
FROM tabled a
INNER JOIN tablee b
ON a.COUNTRY_ID = b.COUNTRY_ID
AND a.PK_LOYALTYACCOUNT = b.PK_LOYALTYACCOUNT
AND a.CDC_TYPE = 'U'
)
SELECT 1 AS is_deleted,
a.*
FROM tabled a
INNER JOIN cmn
ON a.CDC_TYPE = cmn.CDC_TYPE
and a.COUNTRY_ID = cmn.COUNTRY_ID
AND a.PK_LOYALTYACCOUNT = cmn.PK_LOYALTYACCOUNT
UNION ALL
SELECT 0 AS is_deleted,
b.*
FROM tablee b
INNER JOIN cmn
ON b.CDC_TYPE = cmn.CDC_TYPE
and b.COUNTRY_ID = cmn.COUNTRY_ID
AND b.PK_LOYALTYACCOUNT = cmn.PK_LOYALTYACCOUNT
UNION ALL
SELECT NULL AS CDC_TYPE,
a.*
FROM tabled a
WHERE a.CDC_TYPE = 'N'
UNION ALL
SELECT NULL AS CDC_TYPE,
b.*
FROM tablee b
WHERE b.CDC_TYPE = 'N'
sql脚本如下所示:
COUNTRY_ID CDC_TYPE PK_LOYALTYACCOUNT is_deleted
DE U 666 1
DE U 666 0
RT N 54 replace null
WE N 578 replace null
DE N 769 replace null
with cmn as
( SELECT a.CDC_TYPE,
a. PK_LOYALTYACCOUNT, --Add these also in CTE result set
a.COUNTRY_ID --Add these also in CTE result set
FROM tabled a
INNER JOIN tablee b
ON a.COUNTRY_ID = b.COUNTRY_ID
AND a.PK_LOYALTYACCOUNT = b.PK_LOYALTYACCOUNT
AND a.CDC_TYPE = 'U'
)
SELECT 1 AS is_deleted,
a.*
FROM tabled a
INNER JOIN cmn
ON a.CDC_TYPE = cmn.CDC_TYPE
and a.COUNTRY_ID = cmn.COUNTRY_ID
AND a.PK_LOYALTYACCOUNT = cmn.PK_LOYALTYACCOUNT
UNION ALL
SELECT 0 AS is_deleted,
b.*
FROM tablee b
INNER JOIN cmn
ON b.CDC_TYPE = cmn.CDC_TYPE
and b.COUNTRY_ID = cmn.COUNTRY_ID
AND b.PK_LOYALTYACCOUNT = cmn.PK_LOYALTYACCOUNT
UNION ALL
SELECT NULL AS CDC_TYPE,
a.*
FROM tabled a
WHERE a.CDC_TYPE = 'N'
UNION ALL
SELECT NULL AS CDC_TYPE,
b.*
FROM tablee b
WHERE b.CDC_TYPE = 'N'
提前感谢您可能可以在所有这些联合查询中使用一个字符串作为“is_deleted” 但是,也许这个查询也可以通过完全连接来简化 例如:
SELECT PK_LOYALTYACCOUNT, COUNTRY_ID, CDC_TYPE, IS_DELETED
FROM
(
SELECT
COALESCE(d.PK_LOYALTYACCOUNT, e.PK_LOYALTYACCOUNT) AS PK_LOYALTYACCOUNT,
COALESCE(d.COUNTRY_ID, e.COUNTRY_ID) AS COUNTRY_ID,
COALESCE(d.CDC_TYPE, e.CDC_TYPE) AS CDC_TYPE,
(CASE
WHEN d.CDC_TYPE = e.CDC_TYPE AND d.CDC_TYPE = 'U' THEN '1'
WHEN d.CDC_TYPE = e.CDC_TYPE AND d.CDC_TYPE = 'N' THEN '0'
ELSE ''
END) AS IS_DELETED
FROM tabled d
FULL JOIN tablee e
ON e.PK_LOYALTYACCOUNT = d.PK_LOYALTYACCOUNT
AND e.COUNTRY_ID = d.COUNTRY_ID
AND e.CDC_TYPE = d.CDC_TYPE
WHERE d.CDC_TYPE = e.CDC_TYPE
OR d.CDC_TYPE = 'N'
OR e.CDC_TYPE = 'N'
) AS cmn
GROUP BY PK_LOYALTYACCOUNT, COUNTRY_ID, CDC_TYPE, IS_DELETED
ORDER BY IS_DELETED DESC, PK_LOYALTYACCOUNT, COUNTRY_ID, CDC_TYPE;
以文本形式发布表格和数据。请解释所需输出的逻辑。请阅读,这里是一个学习如何提高问题质量和获得更好答案的好地方。请查看建议的表格--Sql Server 2014 Express Edition--批次用“go”分隔选择@版本作为“Sql Server版本”创建表格a(PK_-LOYALTYACCOUNT int,COUNTRY_-ID varchar(50),CDC_-TYPE varchar(50));插入a值(666,'DE','U'),(98,'DE','U'),(27975373,'DE','U');从列表中选择*;创建表b(PK_-loyaltycountint、COUNTRY_-ID varchar(50)、CDC_-TYPE varchar(50));插入b值(666,'DE','U'),(75,'DE','U'),(27975370,'DE','U');所需的输出是第三幅图像。谢谢不要在注释部分添加代码,只需编辑您的问题以包含传统信息。没有解释的图像没有帮助。:'(绝对完美。非常感谢。很抱歉提出了一个措词糟糕的问题。但是,你答对了。最后一句话,我尝试在spark.sql中输入命令,将你的命令括在“yourcommandsher”中,但它返回一个错误,即('EOF in multi-line string',(1,73))。如果您不熟悉spark.sql,请不要担心,如果您熟悉spark.sql,您的帮助将非常大appreciated@Carltonp没有,从来没有用过。但是谷歌搜索暗示,如果某个地方缺少撇号,可能会发生类似的事情。F.e.有人能帮助修改问题中的原始脚本,以便删除列被删除?@Carltonp不确定你的意思。你创建了这个问题,所以你可以编辑它。这个问题是关于“被删除”中应该显示什么?你的意思是它应该有另一个别名吗?如果我真的不明白这一点,那么一旦你得到了一些有用的东西,你就可以为你的个人脚本编辑它,这个问题不需要对此进行调整。