【发布时间】:2021-06-10 21:12:52
【问题描述】:
在 SQL Server 中,我有一个目标表 STAGNG_PA_BK_FEED_REVNU_SUM,它具有构成其唯一索引的以下 7 列。我想使用主要来自 STAGNG_PA_BK_FEED_REVNU_DTL 表的数据填充此表。目标表中的数据包括一个金额字段 REVNU_AMT,它是通过对所有其他选定/非聚合列进行分组来聚合的。
因为我们选择了不包含在目标表的唯一键中的附加“属性”列,如果我们在键组中为属性列获得多个不同的值组合,则插入将失败。发生这种情况时,我希望能够识别共享相同主键但具有不同属性值组合的所有源记录。换句话说,我希望能够生成完整源记录的报告,以便业务用户在插入时识别导致唯一键违规的违规记录。
INSERT INTO dbo.STAGNG_PA_BK_FEED_REVNU_SUM
(
--Keys of target table
RBT_YR_DT
, MLR_SRC_SYS_CD
, LGL_ENTTY_CD
, CLIENT_ID
, CLIENT_ACCT_NUM
, BEN_PLAN_ID
, CLIENT_CNTRCT_ST_CD
--Properties of target table
, MLR_EXTRT_SYS_CD
, PA_LGL_ENTTY_CD
, COA_CO_CD
, COMMRCL_BUS_IND
, COA_SITUS_ST_CD
, ASGND_SITUS_STE_IND
, CLIENT_TY_CD
, MLR_SEG_CD
--Fact
, REVNU_AMT
)
SELECT
--values for keys of target table
D.RBT_YR_DT
, D.MLR_SRC_SYS_CD
, D.LGL_ENTTY_CD
, D.CLIENT_ID
, D.CLIENT_ACCT_NUM
, D.BEN_PLAN_ID
, J.SITUS_STE_CD AS CLIENT_CNTRCT_ST_CD
--values for properties of target table
, D.MLR_EXTRT_SYS_CD
, D.PA_LGL_ENTTY_CD
, D.COA_CO_CD
, D.COMMRCL_BUS_IND
, D.COA_SITUS_ST_CD
, 'N' AS ASGND_SITUS_STE_IND
, D.CLIENT_TY_CD
, D.MLR_SEG_CD
--Fact
,SUM(D.REVNU_AMT) AS REVNU_AMT
FROM
dbo.STAGNG_PA_BK_FEED_REVNU_DTL D
INNER JOIN JE_NT_STE_MAP J
ON D.COA_SITUS_ST_CD = J.CONTRACT_SITUS_STATE
GROUP BY
--PK
D.RBT_YR_DT
, D.MLR_SRC_SYS_CD
, D.LGL_ENTTY_CD
, D.CLIENT_ID
, D.CLIENT_ACCT_NUM
, D.BEN_PLAN_ID
, J.SITUS_STE_CD
--Properties
-- Must be unique distinct group of value within the key grouping else key violation on target will result
, D.MLR_EXTRT_SYS_CD
, D.PA_LGL_ENTTY_CD
, D.COA_CO_CD
, D.COMMRCL_BUS_IND
, D.COA_SITUS_ST_CD
, D.CLIENT_TY_CD
, D.MLR_SEG_CD
更新
我之前考虑过使用 Jaime 将所有属性值连接成一个值的方法,以便可以在 HAVING 子句中应用 DISTINCT 动词。
接受他的回答,我修改它以显示报告源表中需要检查和更正的所有记录,以防止重复键违规,这是我的目标,而不仅仅是显示重复的非键价值观。
WITH DUPS AS
(
SELECT
--values for keys of target table
D.RBT_YR_DT
, D.MLR_SRC_SYS_CD
, D.LGL_ENTTY_CD
, D.CLIENT_ID
, D.CLIENT_ACCT_NUM
, D.BEN_PLAN_ID
, J.SITUS_STE_CD AS CLIENT_CNTRCT_ST_CD
FROM
dbo.STAGNG_PA_BK_FEED_REVNU_DTL D
INNER JOIN JE_NT_STE_MAP J
ON D.COA_SITUS_ST_CD = J.CONTRACT_SITUS_STATE
GROUP BY
--PK
D.RBT_YR_DT
, D.MLR_SRC_SYS_CD
, D.LGL_ENTTY_CD
, D.CLIENT_ID
, D.CLIENT_ACCT_NUM
, D.BEN_PLAN_ID
, J.SITUS_STE_CD
HAVING
COUNT(DISTINCT
CONVERT(VARCHAR(MAX), D.MLR_EXTRT_SYS_CD) + '-' +
CONVERT(VARCHAR(MAX), D.PA_LGL_ENTTY_CD) + '-' +
CONVERT(VARCHAR(MAX), D.COA_CO_CD) + '-' +
CONVERT(VARCHAR(MAX), D.COMMRCL_BUS_IND) + '-' +
CONVERT(VARCHAR(MAX), D.COA_SITUS_ST_CD) + '-' +
CONVERT(VARCHAR(MAX), D.CLIENT_TY_CD) + '-' +
CONVERT(VARCHAR(MAX), D.MLR_SEG_CD)
) > 1
)
SELECT
--Keys
D.RBT_YR_DT
, D.MLR_SRC_SYS_CD
, D.LGL_ENTTY_CD
, D.CLIENT_ID
, D.CLIENT_ACCT_NUM
, D.BEN_PLAN_ID
, D.COA_SITUS_ST_CD
--Properties that have dups with a key groups
, D.MLR_EXTRT_SYS_CD
, D.PA_LGL_ENTTY_CD
, D.COA_CO_CD
, D.COMMRCL_BUS_IND
, D.COA_SITUS_ST_CD
-- , 'N' AS ASGND_SITUS_STE_IND
, D.CLIENT_TY_CD
, D.MLR_SEG_CD
FROM
STAGNG_PA_BK_FEED_REVNU_DTL D
INNER JOIN JE_NT_STE_MAP J
ON D.COA_SITUS_ST_CD = J.CONTRACT_SITUS_STATE
inner join DUPS ON
DUPS.RBT_YR_DT = D.RBT_YR_DT
AND DUPS.MLR_SRC_SYS_CD = D.MLR_SRC_SYS_CD
AND DUPS.LGL_ENTTY_CD = D.LGL_ENTTY_CD
AND DUPS.CLIENT_ID = D.CLIENT_ID
AND DUPS.CLIENT_ACCT_NUM = D.CLIENT_ACCT_NUM
AND DUPS.BEN_PLAN_ID = D.BEN_PLAN_ID
AND DUPS.CLIENT_CNTRCT_ST_CD = J.SITUS_STE_CD
order by 1,2,3,4,5,6,7,8,9,10,11,12,13,14
虽然这在实践中可能有效,但我发现它有点笨拙,最后我可能会显示具有重复的非键的记录,该非键出现 另一个键分组但只出现在那里一次最终报告可能不准确。
【问题讨论】:
-
你能添加一些数据来测试答案吗? @乍得
-
@Chad,如果你删除这个问题不是更好,因为stackoverflow.com/questions/67939946/… 是一个更好的说法吗?
标签: sql sql-server tsql