Sql 如何选择多个案例

Sql 如何选择多个案例,sql,sql-server,database,Sql,Sql Server,Database,为混乱的演讲提前道歉。(|充当分隔符) 下面是我的数据集,期望输出(从规则中导出期望值) 以下方面需要您的帮助:- 1.提出欲望与最终矛盾场。(我尝试了以下脚本,但没有成功) 样本数据集 create table Sample ( Id int, VoterId int, DataEntry int, Contradiction int) insert into Sample(Id, VoterId, DataEntry, Contradiction) values (14

为混乱的演讲提前道歉。(|充当分隔符)

下面是我的数据集,期望输出(从规则中导出期望值)

以下方面需要您的帮助:- 1.提出欲望与最终矛盾场。(我尝试了以下脚本,但没有成功)

样本数据集

create table Sample (
  Id int,
  VoterId int,
  DataEntry int,
  Contradiction int)

insert into Sample(Id, VoterId, DataEntry, Contradiction)
values
  (14389, 162178, 1, 1),
  (14389, 161966, 2, 1),
  (212, 379220, 1, 0),
  (212, 379213, 2, 0),
  (14482, 19942, 1, 1),
  (14482, 37541, 2, 1),
  (14621, 11150, 1, 0),
  (14621, 11149, 2, 1),
  (14621, 35449, 3, 1),
  (14741, 26904, 1, 1),
  (14741, 46558, 2, 1),
  (14741, 37923, 3, 1)
ID | VoterId | DataEntry | Desired_Contradiction 14389 | 161966 | 2 | 1 212 | 379213 | 2 | 0 14482 | 37541 | 2 | 1 14621 | 11149 | 2 | 1 14741 | 46558 | 2 | 1 所需输出

create table Sample (
  Id int,
  VoterId int,
  DataEntry int,
  Contradiction int)

insert into Sample(Id, VoterId, DataEntry, Contradiction)
values
  (14389, 162178, 1, 1),
  (14389, 161966, 2, 1),
  (212, 379220, 1, 0),
  (212, 379213, 2, 0),
  (14482, 19942, 1, 1),
  (14482, 37541, 2, 1),
  (14621, 11150, 1, 0),
  (14621, 11149, 2, 1),
  (14621, 35449, 3, 1),
  (14741, 26904, 1, 1),
  (14741, 46558, 2, 1),
  (14741, 37923, 3, 1)
ID | VoterId | DataEntry | Desired_Contradiction 14389 | 161966 | 2 | 1 212 | 379213 | 2 | 0 14482 | 37541 | 2 | 1 14621 | 11149 | 2 | 1 14741 | 46558 | 2 | 1 ID | VoterId |数据输入|期望|u矛盾 14389 | 161966 | 2 | 1 212 | 379213 | 2 | 0 14482 | 37541 | 2 | 1 14621 | 11149 | 2 | 1 14741 | 46558 | 2 | 1 规则:-

  • 所需输出中所需字段的逻辑
    对于2个数据条目,当(满足以下逻辑)否则为0时,所需的_矛盾将为1
  • 数据录入|矛盾 1 | 1 2 | 1 对于3个数据条目,当(满足以下逻辑)否则为0时,最终矛盾将为1

    数据录入|矛盾 1 | 0或1 2 | 1 3 | 1
  • 所需输出中的VoterId将是来自数据项的VoterId=2
  • 任何帮助都将不胜感激。
    非常感谢。

    这不是最漂亮的解决方案,但它可能会让您领先一步:

    ;WITH DataEntry2VoterID AS
    (
        SELECT
            S.ID,
            S.VoterId
        FROM
            Sample AS S
        WHERE
            S.DataEntry = 2
    )
    SELECT
        S.Id,
        V.VoterId,
        ContradictionThingy = CASE
            WHEN 
                COUNT(1) = 2 AND SUM(S.Contradiction) = 2 THEN 1
            WHEN 
                COUNT(1) = 3 AND SUM(CASE 
                    WHEN S.DataEntry IN (2,3) AND S.Contradiction = 1 THEN 1
                    ELSE -999 END) = 2 THEN 1
            ELSE 
                0 END
    FROM
        Sample AS S
        LEFT JOIN DataEntry2VoterID AS V ON S.Id = V.Id
    GROUP BY
        S.Id,
        V.VoterId
    

    找到解决方案,只是共享,以防有人可能正在查看相同的查询:-

    select ID
    ,CASE WHEN VOTERID2 is not null then VOTERID2 ELSE VOTERID END VOTERID -- always check if VOTERID2 populated then take VOTERID2 else VOTERID. VOTERID3 is not used
    ,CASE   WHEN DATAENTRY2 is not null then DATAENTRY2 else DATAENTRY END DATAENTRY -- always check if DATAENTRY2 is not null then take DATAENTRY2 else use DATAENTRY. DATAENTRY3 is not used
    ,CASE   WHEN CONTRADICTION =1 and CONTRADICTION2 = 1 AND CONTRADICTION3 is null then '1'
            WHEN CONTRADICTION in (0,1) and CONTRADICTION2 = 1 AND CONTRADICTION3 = 1 then '1'
            ELSE '0'
            END CONTRADICTION
    from (
           Select ID,VOTERID,DATAENTRY,CONTRADICTION
                 ,LEAD (VOTERID,1) OVER (PARTITION BY ID ORDER BY ID) AS VOTERID2
                 ,LEAD (DATAENTRY,1) OVER (PARTITION BY ID ORDER BY ID) AS DATAENTRY2
                 ,LEAD (CONTRADICTION,1) OVER (PARTITION BY ID ORDER BY ID) AS CONTRADICTION2
                 ,LEAD (VOTERID,2) OVER (PARTITION BY ID ORDER BY ID) AS VOTERID3 
                 ,LEAD (DATAENTRY,2) OVER (PARTITION BY ID ORDER BY ID) AS DATAENTRY3
                 ,LEAD (CONTRADICTION,2) OVER (PARTITION BY ID ORDER BY ID) AS CONTRADICTION3
           from sample
          ) SAMPLE_COMBINE 
            Where DATAENTRY = 1
    

    )

    你真的需要更好地格式化你的问题,我怀疑你可能会得到这样的答案。@PaulKaram:我真的不知道如何格式化我的问题,因为我无法插入图片。有什么好注意的吗?不喜欢只贴一张照片。你最好检查一下,让自己熟悉一下。谢谢@PaulKaramHi@Ezequiel Lopez:谢谢你的尝试,但是代码只有在矛盾都为1时才起作用。我认为当行相互排斥时,不能用in作为in。它既不考虑行,也不考虑行。不用担心,我找到了解决方案并将与大家分享。
    select ID
    ,CASE WHEN VOTERID2 is not null then VOTERID2 ELSE VOTERID END VOTERID -- always check if VOTERID2 populated then take VOTERID2 else VOTERID. VOTERID3 is not used
    ,CASE   WHEN DATAENTRY2 is not null then DATAENTRY2 else DATAENTRY END DATAENTRY -- always check if DATAENTRY2 is not null then take DATAENTRY2 else use DATAENTRY. DATAENTRY3 is not used
    ,CASE   WHEN CONTRADICTION =1 and CONTRADICTION2 = 1 AND CONTRADICTION3 is null then '1'
            WHEN CONTRADICTION in (0,1) and CONTRADICTION2 = 1 AND CONTRADICTION3 = 1 then '1'
            ELSE '0'
            END CONTRADICTION
    from (
           Select ID,VOTERID,DATAENTRY,CONTRADICTION
                 ,LEAD (VOTERID,1) OVER (PARTITION BY ID ORDER BY ID) AS VOTERID2
                 ,LEAD (DATAENTRY,1) OVER (PARTITION BY ID ORDER BY ID) AS DATAENTRY2
                 ,LEAD (CONTRADICTION,1) OVER (PARTITION BY ID ORDER BY ID) AS CONTRADICTION2
                 ,LEAD (VOTERID,2) OVER (PARTITION BY ID ORDER BY ID) AS VOTERID3 
                 ,LEAD (DATAENTRY,2) OVER (PARTITION BY ID ORDER BY ID) AS DATAENTRY3
                 ,LEAD (CONTRADICTION,2) OVER (PARTITION BY ID ORDER BY ID) AS CONTRADICTION3
           from sample
          ) SAMPLE_COMBINE 
            Where DATAENTRY = 1