如何选择多个案例

时间:2018-03-28 08:22:12

标签: sql sql-server database

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

下面是我的DataSet,Desired Output(从规则派生出Desired_Contradiction)

需要你的帮助: - 1.加入Desire_Final_Contradiction字段。 (我尝试了以下脚本,但它没有用)

select
  ID,
  'Final_Contradiction' = CASE WHEN (
    (B.[DataEntry] in (1,2) and B.[Contradiction] = 1) or
    (B.[DataEntry] in (2,3) and B.[Contradiction] = 1))
    THEN 1
    ELSE 0
    END
from Test

Sample_Dataset

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

规则: -

  1. 所需输出中Desired_Contradiction字段的逻辑
    对于2个数据条目当(以下逻辑满足)时,desired_contradiction将为1,否则为0
  2. Data_Entry | Contradiction  
    1          | 1   
    2          | 1
    

    对于3个数据条目,当以下逻辑满足时,__ final_contradiction将为1,否则为0

    Data_Entry | Contradiction
    1          | 0 or 1
    2          | 1   
    3          | 1
    
    1. 所需输出中的VoterId将是DataEntry = 2的投票ID
    2. 非常感谢任何帮助。 非常感谢你。

2 个答案:

答案 0 :(得分:0)

不是最漂亮的解决方案,但它可能会给你一个良好的开端:

;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

答案 1 :(得分:0)

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

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