"H L" <[EMAIL PROTECTED]> wrote on 04/02/2006 11:51:48 AM:

> Hi, i have a problem to  select sum from same table using UNION.  The 
key 
> question is there a way of combining two questions in one so the 
resulting 
> objectid in query1 is only used in query 2 in a smart way. Eg. if only 
one 
> object is avaliable in a search first year then only check that objectid 
for 
> next year and append the sum in the question.
> 
> I have 4 tables
> companyobjects that contains the key (companyid,objectid,name etc)
> 
> and  i have
> calendar the table looks similar to this 
> (objectid,year,day1,day2.....day365)
> price that looks similar to this (objectid,year,day1,day2.....day365)
> reservation that looks similar to this 
(objectid,year,day1,day2.....day365)
> 
> 
> I have tried as follows below, as you can see i want to calculate price 
> discount and amount to pay from same table but from 2 years. I have 
tried 
> removed all my "where" clause below and the result is not correct it is 
not 
> from both querys.
> 
> 
> Maybe you know an easier way, totaly diffrent way that i have not 
thought of 
> perhaps.
> 
> Thanks in advance /Henrik
> 
> 
> SELECT
> `companyobjects`.`objectid`,
> Sum(`objectprice`.`d362` +`objectprice`.`d363` 
> +`objectprice`.`d364`+`objectprice`.`d365`),
> Sum((`objectprice`.`d362` +`objectprice`.`d363` 
> +`objectprice`.`d364`+`objectprice`.`d365`)*0.1),
> Sum((`objectprice`.`d362` +`objectprice`.`d363` 
> +`objectprice`.`d364`+`objectprice`.`d365`)*0.9)
> FROM
> `companyobjects`
> Inner Join `objectprice` ON `companyobjects`.`objectid` = 
> `objectprice`.`objectid`
> Inner Join `objectreservation` ON `companyobjects`.`objectid` = 
> `objectreservation`.`objectid`
> Inner Join `objectcalendar` ON `companyobjects`.`objectid` = 
> `objectcalendar`.`objectid`
> 
> WHERE
> `companyobjects`.`companyid` = 'C050319112022656' AND
> `companyobjects`.`maxnrofguests` >= '1' AND
> `objectprice`.`year` = '2006' AND
> `objectreservation`.`year` = '2006' AND
> `objectcalendar`.`year` = '2006'
> 
> GROUP BY
> `companyobjects`.`objectid`
> 
> UNION ALL
> 
> SELECT
> `companyobjects`.`objectid`,
> Sum(`objectprice`.`d1` +`objectprice`.`d2`),
> Sum((`objectprice`.`d1` +`objectprice`.`d2`)*0.1),
> Sum((`objectprice`.`d1` +`objectprice`.`d2`)*0.9)
> FROM
> `companyobjects`
> Inner Join `objectprice` ON `companyobjects`.`objectid` = 
> `objectprice`.`objectid`
> Inner Join `objectreservation` ON `companyobjects`.`objectid` = 
> `objectreservation`.`objectid`
> Inner Join `objectcalendar` ON `companyobjects`.`objectid` = 
> `objectcalendar`.`objectid`
> WHERE
> `companyobjects`.`companyid` = 'C050319112022656' AND
> `companyobjects`.`maxnrofguests` >= '1' AND
> `objectprice`.`year` = '2007' AND
> `objectreservation`.`year` = '2007' AND
> `objectcalendar`.`year` = '2007'
> GROUP BY
> `companyobjects`.`objectid`
> 
> 
> 
> 
> 
> 
> I
> 
> _________________________________________________________________
> Hitta rätt på nätet med MSN Search http://search.msn.se/


The solution is to redesign your tables. You need to split into separate 
columns the values you want to maintain. You do not want to keep the "flat 
file" design you are currently trying to use.

CREATE TABLE calendar (
  objectid,
  year,
  dayofyear,
  ... other fields...
)

CREATE TABLE price (
  objectid,
  year,
  dayofyear,
  price
)

Having a separate column for each day of the year may make sense to a 
person but as you have discovered, it is extremely difficult to use for 
any kind of ad-hoc querying.  A more normalized data structure will be 
almost as efficient in space usage but 1000s of times more efficient for 
querying.  There is no simple way to write a query that spans years with 
the table structures you currently have.

Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine

Reply via email to