Sql 存储过程逻辑错误

Sql 存储过程逻辑错误,sql,tsql,stored-procedures,sql-server-2000,Sql,Tsql,Stored Procedures,Sql Server 2000,我正在尝试做类似的事情 然而,在这一逻辑中 本质上,我有一个ID列表,可以有多个与之关联的值,这些值是Yes、No或其他字符串。对于ID x,如果任何值为是,则x应为是;如果它们都为否,则应为否;如果它们包含除是和否以外的任何其他值,则显示该值。我只希望每个ID返回1行,不重复 但在我的逻辑中,如果所有值都是是,那么显示是,如果所有值都是否,那么显示否,如果它是是是、否或其他任何显示组合的组合 DECLARE @tempTable table ( ID int, Val varchar(1)

我正在尝试做类似的事情

然而,在这一逻辑中 本质上,我有一个ID列表,可以有多个与之关联的值,这些值是Yes、No或其他字符串。对于ID x,如果任何值为是,则x应为是;如果它们都为否,则应为否;如果它们包含除是和否以外的任何其他值,则显示该值。我只希望每个ID返回1行,不重复

但在我的逻辑中,如果所有值都是是,那么显示是,如果所有值都是否,那么显示否,如果它是是是、否或其他任何显示组合的组合

DECLARE @tempTable table ( ID int, Val varchar(1) )

    INSERT INTO @tempTable ( ID, Val ) VALUES ( 10, 'Y')
    INSERT INTO @tempTable ( ID, Val ) VALUES ( 11, 'N')
    INSERT INTO @tempTable ( ID, Val ) VALUES ( 11, 'N')
    INSERT INTO @tempTable ( ID, Val ) VALUES ( 12, 'Y')
    INSERT INTO @tempTable ( ID, Val ) VALUES ( 12, 'Y')
    INSERT INTO @tempTable ( ID, Val ) VALUES ( 12, 'Y')
    INSERT INTO @tempTable ( ID, Val ) VALUES ( 13, 'N')
    INSERT INTO @tempTable ( ID, Val ) VALUES ( 14, 'Y')
    INSERT INTO @tempTable ( ID, Val ) VALUES ( 14, 'N')
    INSERT INTO @tempTable ( ID, Val ) VALUES ( 15, 'Y')
    INSERT INTO @tempTable ( ID, Val ) VALUES ( 16, 'Y')
    INSERT INTO @tempTable ( ID, Val ) VALUES ( 17, 'F')
    INSERT INTO @tempTable ( ID, Val ) VALUES ( 18, 'P')


    SELECT DISTINCT t.ID, COALESCE(t2.Val, t3.Val, t4.Val)
    FROM @tempTable t
    LEFT JOIN
    (
        SELECT ID, Val
        FROM @tempTable
        WHERE Val = 'Y'
    ) t2 ON t.ID = t2.ID
    LEFT JOIN
    (
        SELECT 
        ID, Val FROM @tempTable
        WHERE Val = 'N'
    ) t3 ON t.ID = t3.ID
    LEFT JOIN
    (
        SELECT ID, Val
        FROM @tempTable
        WHERE Val <> 'Y' AND Val <> 'N'
    ) t4 ON t.ID = t4.ID

Update dbo.households
SET dbo.households.code = #TempTable.code
FROM #TempTable
WHERE dbo.households.id = #TempTable.id 
您可以使用max,因为它是一个char值。试一试:

注:此处采用的逻辑是非Y/N>任何Y>仅N

[编辑]重构和简化:

select
 t.ID
,isnull(max(nyn.Val),max(yn.Val)) as Val
from @tempTable as t    
    left join @tempTable as nyn -- Non-Y/N value
    on nyn.ID = t.ID
    and nyn.Val not in ('Y','N')
    left join @tempTable as yn -- Y/N value
    on yn.ID = t.ID
    and yn.Val in ('Y','N')
group by t.ID
产生以下结果:

ID  Val
10  Y
11  N
12  Y
13  N
14  Y
15  Y
16  Y
17  F
18  P
或者如果存在,则返回Y的版本,而不是如果所有的都是Y

或者最终版本,如果它们包含任何其他值,但“是”和“否”,则显示该值。声明

SELECT  ID ,
        ISNULL(MAX(CASE WHEN Val = 'Y' THEN 'Y'END), 
               ISNULL(MAX(CASE WHEN Val NOT IN ( 'N', 'Y' ) THEN Val END), 
                      MAX(Val)))
FROM    @tempTable
GROUP BY ID

另一种方法。如果有多个值返回Y和N以外的值,则使用MAX

SELECT  
  ID,
  CASE  
    WHEN EXISTS(SELECT 1 FROM @tempTable tt WHERE t.ID = tt.ID AND tt.Val = 'Y')
             THEN 'Y'
    WHEN EXISTS(SELECT 1 FROM @tempTable tt WHERE t.ID = tt.ID AND tt.Val NOT IN ('Y','N')) 
             THEN (SELECT MAX(Val) FROM @tempTable  tt WHERE t.ID = tt.ID AND tt.Val NOT IN ('Y','N'))
    ELSE 'N'
  END           
FROM    @tempTable t
GROUP BY ID

出于某种原因,如果结果为N,N,P,它仍然显示N,或者如果结果为Y,N它将显示Y。我希望Y,Y显示为Y,N,N显示为N,其他所有内容显示为“M”。谢谢,但出于某种原因,我的update语句不起作用,但我执行查询时的结果是正确的。所以基本上我现在得到了正确的结果,但是我的更新查询给了我旧的值Ah,所以如果一条记录同时有y和n,您将返回两行?+1顺便说一句,关于您回答中关于CTEs和SQL Server 2000派生表的早期注释,如果对您有用的话,仍然可用。@antisanity 14同时有y和n,所以m是必需的。@antisanity-啊,我明白您的意思了意思是问题本身有两个相互矛盾的规范。我假设其中一个描述了当前行为,另一个描述了期望的行为。我将添加一个粗体规范的版本,@antisanity-刚刚再次阅读了规范,我可以看到你是从哪里来的,但在OP澄清要求之前,我不会做任何进一步的编辑。我改变了主意,但这是最后一次编辑,没有OP的任何额外输入!
SELECT  ID ,
        ISNULL(MAX(CASE WHEN Val = 'Y' THEN 'Y'END), 
               ISNULL(MAX(CASE WHEN Val NOT IN ( 'N', 'Y' ) THEN Val END), 
                      MAX(Val)))
FROM    @tempTable
GROUP BY ID
SELECT  
  ID,
  CASE  
    WHEN EXISTS(SELECT 1 FROM @tempTable tt WHERE t.ID = tt.ID AND tt.Val = 'Y')
             THEN 'Y'
    WHEN EXISTS(SELECT 1 FROM @tempTable tt WHERE t.ID = tt.ID AND tt.Val NOT IN ('Y','N')) 
             THEN (SELECT MAX(Val) FROM @tempTable  tt WHERE t.ID = tt.ID AND tt.Val NOT IN ('Y','N'))
    ELSE 'N'
  END           
FROM    @tempTable t
GROUP BY ID