首页 > 解决方案 > 2 sql 使用 UNION 查询 2 个不同的结果

问题描述

我有 2 个查询以相同的表开头但过滤不同的列。两个查询合并在一起,所以我可以得到一个不重复的人的计数。

如果我在注释掉联合的情况下运行查询,则每 1,953 行中的行数相同。当我与工会一起跑步时,我得到了 1,816 和 1,922。

我的数据只是一个帐户#,例如第一列中的 123456 和第二列中的 1/0。帮助我了解如果我从相同数量的行开始会发生这种情况。

这是其中一个查询

    select distinct acct#, 
    case
    when (lastFilledDate is not null and lastFilledDate<>'00/00/00') or 
    ([Last Filled DC] is not null and [Last Filled DC]<>'00/00/00') or 
      (vivitrol is not null and vivitrol <>'00/00/00') or 
      (sublocade is not null and sublocade <>'00/00/00') or 
      (naltrexone is not null and naltrexone <>'00/00/00')  then 1
    else 0 end as result
    from
    (
    select Acct#, DOB, [COE Contact Note], [COE-INTAKA Doc], [COE-MOM 
    Doc], lastFilledDate, [Last Filled DC],vivitrol,sublocade,naltrexone,
    ROW_NUMBER() over (partition by Acct# order by [COE-INTAKA Doc] desc) 
    as apptRows
    from tblAppBSCImportDashCOE2279 as main
    where (([COE-MOM Doc]='Yes' and  [COE Contact Note] is not null) or 
    [COE-MOM Doc]='No') and Appt is not null
    ) as sub
    where apptRows=1 
    union 
    select distinct acctNo,
    case 
    when
      providerMAT='The Wright Center' and [COE-MOM Doc] is not null then 
      1
      else 0
      end as result
    from
    (
    select acctNo, [COE-MOM Doc], MAT, providerMAT,
    ROW_NUMBER() over (partition by acctNo order by COEBNMOM, [COE-MOM Doc] 
    desc) as apptRows
    from tblAppBSCImportDashCOEHM2544 as main 
    where [COE-MOM Doc] is not null or COEBNMOM is not null
    ) as sub
    where apptRows=1

结果看起来像 acct# 结果 123456 1 234567 0

标签: sql

解决方案


有一种可能。您选择的记录可能会导致每个 select 语句中的记录重复。让我试着用一个例子来说明。(您可以在会话中输入以下查询以进行跟进)

IF OBJECT_ID('TEMPDB..#TEMP1') IS NOT NULL
    DROP TABLE #TEMP1
IF OBJECT_ID('TEMPDB..#TEMP2') IS NOT NULL
    DROP TABLE #TEMP2

CREATE TABLE #TEMP1(
    id              INT
    ,account            INT
    ,amount         INT
    ,yes_no         INT
)
INSERT INTO #TEMP1 (id,account,amount,yes_no)
VALUES(1,123456,5,0)
    ,(2,123456,10,0)
    ,(3,123456,20,0)
CREATE TABLE #TEMP2(
    id              INT
    ,account            INT
    ,amount         INT
    ,yes_no         INT
)
INSERT INTO #TEMP2 (id,account,amount,yes_no)
VALUES(4,123456,5,0)
    ,(5,123456,10,0)
    ,(6,123456,20,0)

SELECT *
FROM #TEMP1

SELECT *
FROM #TEMP2

其输出是 2 个具有不同记录的表:在此处输入图像描述

现在假设我编写了选择帐户和“yes_no”列的查询:

SELECT account,yes_no
FROM #TEMP1

SELECT account,yes_no
FROM #TEMP2

在此处输入图像描述

您可以看到现在所有记录在每个 select 语句中都是相同的值。那么当我将这些查询合并在一起时,您认为会发生什么?

SELECT account,yes_no
FROM #TEMP1
UNION
SELECT account,yes_no
FROM #TEMP2

在此处输入图像描述

UNION 将输出 ENTIRE OUTPUT 的不同值,这也适用于每个查询。这是我认为你正在经历的一个极端例子。您需要为每个查询包含某种 ID,以便可以将其与查询中的其他记录区分开来,例如;

SELECT id,account,yes_no
FROM #TEMP1
UNION
SELECT id,account,yes_no
FROM #TEMP2

在此处输入图像描述


推荐阅读