选定案例中的SQL最小值和最大值关系
我正在使用以下代码从SQL表中检索列-选定案例中的SQL最小值和最大值关系,sql,sql-server-2008,sql-server-2008-r2,Sql,Sql Server 2008,Sql Server 2008 R2,我正在使用以下代码从SQL表中检索列- MAX(CASE WHEN bd.DayText = 'Monday' and bd.BookingDuration = 3 and CONVERT(time(0), bd.StartTime) < CONVERT(time(0), '12:00:00') AND bd.NoOfHOurs < 5.5 and s.PrimarySchool = 1 THEN bd.ID ELSE NULL END) "MondayHourlyAM",
MAX(CASE WHEN bd.DayText = 'Monday' and bd.BookingDuration = 3 and CONVERT(time(0), bd.StartTime) < CONVERT(time(0), '12:00:00') AND bd.NoOfHOurs < 5.5 and s.PrimarySchool = 1 THEN bd.ID ELSE NULL END) "MondayHourlyAM",
MAX(CASE WHEN bd.DayText = 'Monday' and bd.BookingDuration = 3 and CONVERT(time(0), bd.StartTime) < CONVERT(time(0), '12:00:00') AND bd.NoOfHOurs < 5.5 and s.PrimarySchool = 1 THEN s.SchoolName ELSE NULL END) "MondayHourlyAMSchoolName",
MAX(CASE WHEN bd.DayText = 'Monday' and bd.BookingDuration = 3 and CONVERT(time(0), bd.StartTime) < CONVERT(time(0), '12:00:00') AND bd.NoOfHOurs < 5.5 and s.PrimarySchool = 1 THEN REPLACE(REPLACE(LTRIM(RIGHT(CONVERT(VARCHAR, bd.StartTime, 100), 7)) + '-' + LTRIM(RIGHT(CONVERT(VARCHAR(20), bd.EndTime, 100), 7)), 'AM',''), 'PM', '') ELSE NULL END) "MondayHourlyAMTimes",
MAX(CASE WHEN bd.DayText = 'Monday' and bd.BookingDuration = 3 and CONVERT(time(0), bd.StartTime) < CONVERT(time(0), '12:00:00') AND bd.NoOfHOurs < 5.5 and s.PrimarySchool = 1 THEN bd.TotalChargeAmount ELSE NULL END) "MondayHourlyAMTotalChargeAmount",
MAX(CASE WHEN bd.DayText = 'Monday' and bd.BookingDuration = 3 and CONVERT(time(0), bd.StartTime) < CONVERT(time(0), '12:00:00') AND bd.NoOfHOurs < 5.5 and s.PrimarySchool = 1 THEN bd.TotalPayAmount ELSE NULL END) "MondayHourlyAMTotalPayAmount",
MAX(CASE WHEN bd.DayText = 'Monday' and bd.BookingDuration = 3 and CONVERT(time(0), bd.StartTime) < CONVERT(time(0), '12:00:00') AND bd.NoOfHOurs < 5.5 and s.PrimarySchool = 1 THEN bd.BandBookedAt ELSE NULL END) "MondayHourlyAMBandBookedAt",
MIN(CASE WHEN bd.DayText = 'Monday' and bd.BookingDuration = 3 and CONVERT(time(0), bd.StartTime) < CONVERT(time(0), '12:00:00') AND bd.NoOfHOurs < 5.5 and s.PrimarySchool = 1 THEN bd.ID ELSE NULL END) "MondayHourlyAM2",
MIN(CASE WHEN bd.DayText = 'Monday' and bd.BookingDuration = 3 and CONVERT(time(0), bd.StartTime) < CONVERT(time(0), '12:00:00') AND bd.NoOfHOurs < 5.5 and s.PrimarySchool = 1 THEN s.SchoolName ELSE NULL END) "MondayHourlyAM2SchoolName",
MIN(CASE WHEN bd.DayText = 'Monday' and bd.BookingDuration = 3 and CONVERT(time(0), bd.StartTime) < CONVERT(time(0), '12:00:00') AND bd.NoOfHOurs < 5.5 and s.PrimarySchool = 1 THEN REPLACE(REPLACE(LTRIM(RIGHT(CONVERT(VARCHAR, bd.StartTime, 100), 7)) + '-' + LTRIM(RIGHT(CONVERT(VARCHAR(20), bd.EndTime, 100), 7)), 'AM',''), 'PM', '') ELSE NULL END) "MondayHourlyAM2Times",
MIN(CASE WHEN bd.DayText = 'Monday' and bd.BookingDuration = 3 and CONVERT(time(0), bd.StartTime) < CONVERT(time(0), '12:00:00') AND bd.NoOfHOurs < 5.5 and s.PrimarySchool = 1 THEN bd.TotalChargeAmount ELSE NULL END) "MondayHourlyAM2TotalChargeAmount",
MIN(CASE WHEN bd.DayText = 'Monday' and bd.BookingDuration = 3 and CONVERT(time(0), bd.StartTime) < CONVERT(time(0), '12:00:00') AND bd.NoOfHOurs < 5.5 and s.PrimarySchool = 1 THEN bd.TotalPayAmount ELSE NULL END) "MondayHourlyAM2TotalPayAmount",
MIN(CASE WHEN bd.DayText = 'Monday' and bd.BookingDuration = 3 and CONVERT(time(0), bd.StartTime) < CONVERT(time(0), '12:00:00') AND bd.NoOfHOurs < 5.5 and s.PrimarySchool = 1 THEN bd.BandBookedAt ELSE NULL END) "MondayHourlyAM2BandBookedAt",
MAX(bd.DayText='Monday'和bd.BookingDuration=3,CONVERT(time(0),bd.StartTime)
当此代码运行时,我得到了2个预订,但是返回的收费/付款率是针对其他预订的。即-
应该是
预订1-收费20英镑,付款10英镑
预订2-收费100英镑,付款50英镑
但是我越来越
预订1-收费100英镑,付款50英镑
预订2-收费20英镑,付款10英镑
我想这是因为当我使用MAX和MIN时,它会返回最高值和最低值。我如何将返回的MAX和MIN值与“HourlyAM”列相关联
希望我能很好地解释这一点!谢谢我不会在不更好地理解您的数据的情况下尝试通过您的标准,但我认为使用行号()会更好:
这里的想法是,您根据一个字段为符合条件的每一行分配一个排名,然后根据该排名返回整行。鉴于几乎所有case语句都具有相同的逻辑,您确实应该将公共子句从case中移出,并移到查询的主
where
子句中。这是一个小部分一周中的每一天都有6个段落,相似但持续时间不同(即:上午、下午、全天、上午每小时、下午每小时、全天每小时).我意识到这不是最有效的方法,但它似乎工作得很好,而且速度很快。因此,我认为我无法将常用子句移到主要where子句中。干杯
SELECT *
FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY MondayHourlyAMTimes DESC) 'Booking1'
, ROW_NUMBER() OVER (ORDER BY MondayHourlyAMTimes ) 'Booking2'
FROM Table
WHERE common criteria
)
WHERE Booking1 = 1 OR Booking2 = 1