'SubQuery Returns More Than One Row' 使用案例

'SubQuery Returns More Than One Row' Using Case When

当用户有两个成人和一个 child 进行预订时,我似乎很难为用户提供折扣...输出文本如标题所示.虽然我知道这个问题,但我不确定如何解决它才能使结果更加独特。

供参考,价格来自不同的table,但其他一切都在预订中。

感谢任何帮助并提前致谢

UPDATE BOOKING SET TotalCost=
(SELECT SUM(

CASE WHEN NumAdults = 2 AND NumChilds = 1 THEN
(NumAdults*(SELECT Cost FROM prices WHERE AgeType = 'Adult'))
+
(NumChilds*(SELECT Cost FROM prices WHERE AgeType = 'Child' / 2))


ELSE
(NumAdults*(SELECT Cost FROM prices WHERE AgeType = 'Adult'))
+
(NumChilds*(SELECT Cost FROM prices WHERE AgeType = 'Child'))
END
))
WHERE BookID  = 1

这一切的发生 (NumAdults*(SELECT Cost FROM prices WHERE AgeType = 'Adult')

应该是(NumAdults*(SELECT SUM(Cost) FROM prices WHERE AgeType = 'Adult')

你用 Numadults 乘以 resultset

希望对您有所帮助

基本修复是在子查询中执行 SUM:-

UPDATE BOOKING SET TotalCost=
(
    CASE 
        WHEN NumAdults = 2 AND NumChilds = 1 
        THEN
            (NumAdults * (SELECT SUM(Cost) FROM prices WHERE AgeType = 'Adult'))
            +
            (NumChilds * (SELECT SUM(Cost) FROM prices WHERE AgeType = 'Child' / 2))

        ELSE
            (NumAdults * (SELECT SUM(Cost) FROM prices WHERE AgeType = 'Adult'))
            +
            (NumChilds * (SELECT SUM(Cost) FROM prices WHERE AgeType = 'Child'))
    END
)
WHERE BookID  = 1

但如果我们能看到 table 描述和一些示例数据,我不相信没有更好的方法来完成整个查询

例如,如果每个成人和儿童的价格都是唯一的,那么可以这样做:-

UPDATE BOOKING a
LEFT OUTER JOIN prices pa ON pa.AgeType = 'Adult'
LEFT OUTER JOIN prices pc ON pc.AgeType = 'Child'
SET TotalCost = CASE 
                    WHEN NumAdults = 2 AND NumChilds = 1 
                    THEN NumAdults * pa.Cost + (NumChilds * pc.Cost / 2)
                    ELSE NumAdults * pa.Cost + NumChilds * pc.Cost
                END
WHERE BookID  = 1