Domanda

Structures of my tables are as follow.

Table Name : timetable

timetable http://www.4shared.com/download/MYafV7-6ce/timetableTable.png

Table Name : slot_table

timetable http://www.4shared.com/download/9Lp_CBn2ba/slot_table.png

Table Name : instructor(this table is not required for this particular problem)

I want to show the resultant data in my android app in a timetable format somewhat like this:

random http://www.4shared.com/download/oAGiUXVAba/random.png

Question : What query i should write so that subjects of particular days with respective slots will be the result of the query?

1)The days should be in order like monday,tuesday,wednesday.

2)If monday has 2 subjects in 2 different slots then it should display like this :

Day         7:30-9:10AM           9:20-11:00AM        

Monday      Android Workshop      Operating System

This is just a sample.

P.S:As timetable format is required,all the subjects with slot ids of all the days(monday to saturday) must be there in it.

Edit :

I tried this

select day,subject,slot from timetable,slot_table where timetable.slotid = slot_table.slotid 

which gave a result :

a http://www.4shared.com/download/uMU7NA8Oce/random1.png

But i want it in a timetable format which i am not having an idea how to do that.

Edit :

Timetable sample format is something like this :

a

Edit :

I wrote a query

select timetable.day,count(slot_table.subject) as no_of_classes from timetable,slot_table where timetable.slotid = slot_table.slotid group by timetable.day

which resulted in

a http://www.4shared.com/download/rZW20_g8ce/random2.png

So now it shows monday has 2 classes in 2 slots,Tuesday has 1 class in 1 slot and so on.

Now any help on a query which can show the two slots(timings) on monday?

Solution :

select timetable.day,max(case when (slot='7:30-9:10AM') then slot_table.subject END) as "7:30-9:10AM",max(case when (slot='9:20-11:00AM') then slot_table.subject END) as "9:20-11:00AM",max(case when (slot='11:10-12:50PM') then slot_table.subject END) as "11:10-12:50PM",max(case when (slot='1:40-3:20PM') then slot_table.subject END) as "1:40-3:20PM",    max(case when (slot='3:30-5:00PM') then slot_table.subject END) as "3:30-5:00PM" from timetable join slot_table on timetable.slotid = slot_table.slotid group by timetable.day

Result :

a http://www.4shared.com/download/1w7Tyicfce/random3.png

È stato utile?

Soluzione

What you want is called a PIVOT query. In one of these, you have a select which gives the data in rows, like your result just under the EDIT (Day, subject, slot). Then you need to specify the values of the row you want to 'pivot' to become columns (slot in this example). Because a Pivot relies on the values of the column to be pivoted it can be difficult to write a general query, and the Postgres Wiki has an example using dymanic SQL and lots of code generating it at http://wiki.postgresql.org/wiki/Pivot_query

In your case, given that slots look like they're fixed and you might be able to hard-code them (that's a decision you'll have make yourself).

NB I am not a Postgres user, but it looks like it can do it (and I would have been very surprised if it couldn't).

Altri suggerimenti

This is a or query. PostgreSQL has only limited support for these via the crosstab function in the tablefunc module.

It can sometimes be better to just deal with this in the application, accumulating the data into a table as you read each data point.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top