If this is your first visit, be sure to check out the FAQ by clicking the link above. You may have to register before you can post: click the register link above to proceed. To start viewing messages, select the forum that you want to visit from the selection below.

 
Go Back  dBforums > Database Server Software > MySQL > creating new variables / pivots

Reply
 
LinkBack Thread Tools Search this Thread Display Modes
  #1 (permalink)  
Old 01-08-12, 00:50
analytictype analytictype is offline
Registered User
 
Join Date: Jan 2012
Posts: 3
creating new variables / pivots

Imagine the small table created by the code below. My end goal is to have a new column of data that is equal to (sales in a given row)/(average of sales by state by month); basically a kind of index. Let's call this new variable sales_index.

So sales_index for the 1st row of data = 1, second row of data = 1000/1500 etc.

CREATE Table Sales1
(
State Varchar (2) Not Null,
Date Date Not Null,
Sales Varchar (20) Not Null
);

INSERT INTO Sales1 (State, Date, Sales) VALUES ('NY','2012-01-01',1000);

INSERT INTO Sales1 (State, Date, Sales) VALUES ('NY','2012-02-01',1000);

INSERT INTO Sales1 (State, Date, Sales) VALUES ('NY','2012-02-02',2000);

INSERT INTO Sales1 (State, Date, Sales) VALUES ('NJ','2012-01-01',1200);

INSERT INTO Sales1 (State, Date, Sales) VALUES ('NJ','2012-01-01',1100);

I'm kind of stuck. I can get the 1500 I would need for the denominator to be used to calculate sales_index for just the 2nd and 3rd rows of data using the code below, but not sure that I am heading down the right direction:

SELECT
State,
Avg(IF(Month(Date)=2,Sales,Null)) AS Sales_Index_Denominator
FROM Sales1
GROUP BY State;

I have been using MySQL for 1 day (haha) and am very much used to Excel functionality / pivots / formulas as a way of manipulating data. I'm not sure if I should do these calculations and save results in a different table, then join the tables etc. Any help is appreciated.
Reply With Quote
  #2 (permalink)  
Old 01-08-12, 08:30
r937 r937 is offline
SQL Consultant
 
Join Date: Apr 2002
Location: Toronto, Canada
Posts: 19,525
Code:
SELECT t.State
     , t.Date
     , t.Sales
     , a.avgsales AS Sales_Index_Denominator
  FROM ( SELECT State
              , EXTRACT(YEAR_MONTH FROM Date) AS yyyymm
              , AVG(Sales) AS avgsales
           FROM Sales1 
         GROUP 
             BY State
              , EXTRACT(YEAR_MONTH FROM Date) ) AS a
INNER
  JOIN Sales1 AS t
    ON t.State = a.State
   AND EXTRACT(YEAR_MONTH FROM t.Date) = a.yyyymm
__________________
r937.com | rudy.ca
please visit Simply SQL and buy my book
Reply With Quote
  #3 (permalink)  
Old 01-08-12, 11:33
analytictype analytictype is offline
Registered User
 
Join Date: Jan 2012
Posts: 3
Hi-

First - thank you so very much! So I was at least guessing in the right direction in terms of needing to use a join . I want to make sure I understand what you are doing though, as your FROM clause is a bit more complex than Ive seen so far. You are using a subquery that in essence is constructing a new table which you are declaring "a", from which we are doing the inner join on, is this correct? My question is what happens to this table "a"? is it only temporary?When i use the SHOW TABLES FROM command, I don't see any table 'a' listed. Also, what this join is doing is sort of like concatenating state & month and merging together using that as a unique key.

I have some other questions - once I run this query and get the result set, what is the most efficient way to further manipulate the data? I'd like to calculate other things, like create new variables that see how far rows are from the average monthly values that we created, or create the monthly sales index. I rewrote your code like so (changes in bold):

CREATE Table Step1
SELECT t.State
, t.Date
, t.Sales
, a.avgsales AS Sales_Index_Denominator
FROM ( SELECT State
, EXTRACT(MONTH FROM Date) AS mm
, AVG(Sales) AS avgsales
FROM Sales1
GROUP
BY State
, mm ) AS a
INNER
JOIN Sales1 AS t
ON t.State = a.State
AND EXTRACT(MONTH FROM t.Date) = a.mm

CREATE TABLE Result
SELECT *,
Sales/Sales_Index_Denominator AS Sales_Index
FROM step1;


I appreciate your feedback as to whether this is an optimal way to handle this; as some datbases are quite large I am thinking there has to be a better method. I've ordered your book from Amazon, and it should arrive shortly!

Last edited by analytictype; 01-08-12 at 12:15.
Reply With Quote
  #4 (permalink)  
Old 01-08-12, 12:41
analytictype analytictype is offline
Registered User
 
Join Date: Jan 2012
Posts: 3
I think I answered my own follow up question. I rewrote the top of the query:

CREATE Table IndexedSales
SELECT t.State
, t.Date
, t.Sales
, a.avgsales AS denominator
,g.UVs/a.avgsales AS sales_index

so my next question is, when we alias avg sales as Denominator, why can't we use the alias in the calculation on the next line? How does sql execute code? It looks like it isnt line by line, as it has to create table "a" first, then join it to calculate sales_index and then create the table indexedsales
Reply With Quote
  #5 (permalink)  
Old 01-08-12, 17:52
r937 r937 is offline
SQL Consultant
 
Join Date: Apr 2002
Location: Toronto, Canada
Posts: 19,525
Quote:
Originally Posted by analytictype View Post
when we alias avg sales as Denominator, why can't we use the alias in the calculation on the next line?
because you're not allowed to
__________________
r937.com | rudy.ca
please visit Simply SQL and buy my book
Reply With Quote
Reply

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are On