SQL查询组(按包含)

SQL查询组(按包含),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

是否有人可以帮助修改以下SQL脚本,以便我能够执行分组并替换字符(null)

目前我有两张桌子:

表1

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不确定你的意思。你创建了这个问题,所以你可以编辑它。这个问题是关于“被删除”中应该显示什么?你的意思是它应该有另一个别名吗?如果我真的不明白这一点,那么一旦你得到了一些有用的东西,你就可以为你的个人脚本编辑它,这个问题不需要对此进行调整。