簡體   English   中英

存儲過程邏輯錯誤

[英]error with stored procedure logic

我正在嘗試執行與如何改進此SQL查詢類似的操作。

但是,從本質上講,我有一個ID列表,該ID可能具有多個與之關聯的值,這些值是Yes,No或其他字符串。 對於ID x,如果任何值是“是”,則x應該是“是”,如果它們全都是“否”,則它應該是“否”,如果它們包含任何其他值但是和否,則顯示該值。 我只想為每個ID返回1行,沒有重復。

但是在我的邏輯中,如果所有值均為yes,則顯示yes,如果所有值均為no,則顯示no,如果是yes,no或其他任何混合顯示

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 
SELECT  ID ,
        CASE WHEN MAX(Val) = MIN(Val)
                  AND MAX(Val) IN ( 'N', 'Y' ) THEN MAX(Val)
             ELSE 'M'
        END
FROM    @tempTable
GROUP BY ID

或者返回版本Y 如果存在,而不是在所有Y

SELECT  ID ,
        ISNULL(MAX(CASE WHEN Val = 'Y' THEN 'Y' END), 
               CASE WHEN MAX(Val) = MIN(Val) THEN MAX(Val)
                              ELSE 'M'
                         END)
FROM    @tempTable
GROUP BY ID

或最終版本采用字面意義為“如果它們包含任何其他值但是和否,則顯示該值”。 聲明。

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

您可以使用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和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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM