SQL Firebird查询提供不正确的输出

时间:2014-08-19 06:12:08

标签: sql sql-order-by firebird

我有以下Firebird查询:

Select Distinct"Sorter", "Week" AS "WEEK", "Year", "Course" AS "Course"
FROM (
select
(extract(yearday from DATESENT) - extract(weekday from DATESENT-1)+7)/7 as "Sorter",
case extract(week from DATESENT)
when 1 then 'Week # 1 (2 Jan) '
when 2 then 'Week # 2 (09 Jan) '
when 3 then 'Week # 3 (16 Jan) '
when 4 then 'Week # 4 (23 Jan)'
when 5 then 'Week # 5 (30 Jan)'
when 6 then 'Week # 6 (06 Feb)'
when 7 then 'Week # 7 (13 Feb)'
when 8 then 'Week # 8 (20 Feb)'
when 9 then 'Week # 9 (27 Feb)'
when 10 then 'Week # 10 (06 March)'
when 11 then 'Week # 11 (13 March)'
when 12 then 'Week # 12 (20 March)'
when 13 then 'Week # 13 (27 March)'
when 14 then 'Week # 14 (03 April)'
when 15 then 'Week # 15 (10 April)'
when 16 then 'Week # 16 (17 April)'
when 17 then 'Week # 17 (24 April)'
when 18 then 'Week # 18 (01 May)'
when 19 then 'Week # 19 (08 May)'
when 20 then 'Week # 20 (15 May)'
when 21 then 'Week # 21 (22 May)'
when 22 then 'Week # 22 (29 May)'
when 23 then 'Week # 23 (05 Jun)'
when 24 then 'Week # 24 (12 Jun)'
when 25 then 'Week # 25 (19 Jun)'
when 26 then 'Week # 26 (26 Jun)'
when 27 then 'Week # 27 (03 July)'
when 28 then 'Week # 28 (10 July)'
when 29 then 'Week # 29 (17 July)'
when 30 then 'Week # 30 (24 July)'
when 31 then 'Week # 31 (31 July)'
when 32 then 'Week # 32 (07 Aug)'
when 33 then 'Week # 33 (14 Aug)'
when 34 then 'Week # 34 (21 Aug)'
when 35 then 'Week # 35 (28 Aug)'
when 36 then 'Week # 36 (04 Sep)'
when 37 then 'Week # 37 (11 Sep)'
when 38 then 'Week # 38 (18 Sep)'
when 39 then 'Week # 39 (25 Sep)'
when 40 then 'Week # 40 (02 Oct)'
when 41 then 'Week # 41 (09 Oct)'
when 42 then 'Week # 42 (16 Oct)'
when 43 then 'Week # 43 (23 Oct)'
when 44 then 'Week # 44 (30 Oct)'
when 45 then 'Week # 45 (06 Nov)'
when 46 then 'Week # 46 (13 Nov)'
when 47 then 'Week # 47 (20 Nov)'
when 48 then 'Week # 48 (27 Nov)'
when 49 then 'Week # 49 (04 Dec)'
when 50 then 'Week # 50 (11 Dec)'
when 51 then 'Week # 51 (18 Dec)'
when 52 then 'Week # 52 (25 Dec)'
end  as "Week" ,
extract(year from DATESENT) as "Year" ,
COURSE as "Course"


from programmers  
where
--** Change the Between date to select courses starting between those 2 dates format YYYY-MM-DD **--
DATESENT between '2012-12-20' and '2013-12-31'

Group by 1,2,3,4

UNION

select
(extract(yearday from BOOKING_DATE) - extract(weekday from  BOOKING_DATE-1)+7)/7 as "Sorter",
case extract(week from BOOKING_DATE)
when 1 then 'Week # 1 (2 Jan) '
when 2 then 'Week # 2 (09 Jan) '
when 3 then 'Week # 3 (16 Jan) '
when 4 then 'Week # 4 (23 Jan)'
when 5 then 'Week # 5 (30 Jan)'
when 6 then 'Week # 6 (06 Feb)'
when 7 then 'Week # 7 (13 Feb)'
when 8 then 'Week # 8 (20 Feb)'
when 9 then 'Week # 9 (27 Feb)'
when 10 then 'Week # 10 (06 March)'
when 11 then 'Week # 11 (13 March)'
when 12 then 'Week # 12 (20 March)'
when 13 then 'Week # 13 (27 March)'
when 14 then 'Week # 14 (03 April)'
when 15 then 'Week # 15 (10 April)'
when 16 then 'Week # 16 (17 April)'
when 17 then 'Week # 17 (24 April)'
when 18 then 'Week # 18 (01 May)'
when 19 then 'Week # 19 (08 May)'
when 20 then 'Week # 20 (15 May)'
when 21 then 'Week # 21 (22 May)'
when 22 then 'Week # 22 (29 May)'
when 23 then 'Week # 23 (05 Jun)'
when 24 then 'Week # 24 (12 Jun)'
when 25 then 'Week # 25 (19 Jun)'
when 26 then 'Week # 26 (26 Jun)'
when 27 then 'Week # 27 (03 July)'
when 28 then 'Week # 28 (10 July)'
when 29 then 'Week # 29 (17 July)'
when 30 then 'Week # 30 (24 July)'
when 31 then 'Week # 31 (31 July)'
when 32 then 'Week # 32 (07 Aug)'
when 33 then 'Week # 33 (14 Aug)'
when 34 then 'Week # 34 (21 Aug)'
when 35 then 'Week # 35 (28 Aug)'
when 36 then 'Week # 36 (04 Sep)'
when 37 then 'Week # 37 (11 Sep)'
when 38 then 'Week # 38 (18 Sep)'
when 39 then 'Week # 39 (25 Sep)'
when 40 then 'Week # 40 (02 Oct)'
when 41 then 'Week # 41 (09 Oct)'
when 42 then 'Week # 42 (16 Oct)'
when 43 then 'Week # 43 (23 Oct)'
when 44 then 'Week # 44 (30 Oct)'
when 45 then 'Week # 45 (06 Nov)'
when 46 then 'Week # 46 (13 Nov)'
when 47 then 'Week # 47 (20 Nov)'
when 48 then 'Week # 48 (27 Nov)'
when 49 then 'Week # 49 (04 Dec)'
when 50 then 'Week # 50 (11 Dec)'
when 51 then 'Week # 51 (18 Dec)'
when 52 then 'Week # 52 (25 Dec)'
end as "Week",
extract(year from BOOKING_DATE) as "Year" ,
'' as "Course"

from comp_Invoice
where
BOOKING_DATE between '2012-12-20' and '2013-12-31'

 )
GROUP BY 1,2,3,4
Order by 1,3 ASC

返回以下内容:

SORTER - WEEK - YEAR - COURSE
0      -Week1 - 2013 -  
1      -Week2 - 2013 - 
1      -Week2 - 2013 - WHS 
2      -Week3 - 2013 -  
3      -Week4 - 2013 -  
3      -Week4 - 2013 - WHS 
4      -Week5 - 2013 -  
4      -Week5 - 2013 - ALL 
5      -Week6 - 2013 -  
5      -Week6 - 2013 - REF

我们可以看到我在第2周,第4周,第5周和第6周得到2行,但我需要返回如下:

 
SORTER - WEEK - YEAR - COURSE
0      -Week1 - 2013 - 
1      -Week2 - 2013 - WHS
2      -Week3 - 2013 - 
3      -Week4 - 2013 - WHS
4      -Week5 - 2013 - ALL
5      -Week6 - 2013 - REF

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

Derek,看起来你想要MAX值,为什么不试试呢;

SELECT "Sorter", "WEEK", "Year", MAX("Course") FROM ( 
    "YOUR QUERY GOES HERE goes inside the 2 parenthesis"
) T1
GROUP BY 1,2,3

或者如果您在同一周内可以有多个课程,请使用LIST而不是MAX

希望这有帮助。