Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 729851
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 14, 20262026-05-14T06:50:42+00:00 2026-05-14T06:50:42+00:00

I have a table with sales per store as follows: SQL> select * from

  • 0

I have a table with sales per store as follows:

SQL> select * from sales;

        ID ID_STORE DATE       TOTAL
---------- -------- ---------- -------------------------------
         1        1 2010-01-01    500.00
         2        1 2010-01-02    185.00
         3        1 2010-01-03    135.00
         4        1 2009-01-01    165.00
         5        1 2009-01-02    175.00
         6        5 2010-01-01    130.00
         7        5 2010-01-02    135.00
         8        5 2010-01-03    130.00
         9        6 2010-01-01    100.00
         10       6 2010-01-02     12.00
         11       6 2010-01-03     85.00
         12       6 2009-01-01    135.00
         13       6 2009-01-02    400.00
         14       6 2009-01-07     21.00
         15       6 2009-01-08     45.00
         16       8 2009-01-09    123.00
         17       8 2009-01-10    581.00

17 rows selected.

What I need to do is to compare two date ranges within that table. Lets say I need to know the differences in sales between 01 Jan 2009 to 10 Jan 2009 AGAINST 01 Jan 2010 to 10 Jan 2010.

I’d like to build a query that returns something like this:

ID_STORE_A DATE_A     TOTAL_A   ID_STORE_B DATE_B     TOTAL_B
---------- ---------- --------- ---------- ---------- -------------------
         1 2010-01-01    500.00          1 2009-01-01    165.00
         1 2010-01-02    185.00          1 2009-01-02    175.00
         1 2010-01-03    135.00          1 NULL          NULL

         5 2010-01-01    130.00          5 NULL          NULL
         5 2010-01-02    135.00          5 NULL          NULL
         5 2010-01-03    130.00          5 NULL          NULL

         6 2010-01-01    100.00          6 2009-01-01    135.00
         6 2010-01-02     12.00          6 2009-01-02    400.00
         6 2010-01-03     85.00          6 NULL          NULL
         6 NULL          NULL            6 2009-01-07     21.00
         6 NULL          NULL            6 2009-01-08     45.00
         6 NULL          NULL            8 2009-01-09    123.00
         6 NULL          NULL            8 2009-01-10    581.00

So, even if there are no sales in one range or another, it should just fill the empty space with NULL.

So far, I’ve come up with this quick query, but I the “dates” from sales to sales2 sometimes are different in each row:

SELECT sales.*, sales2.*
  FROM sales
  LEFT JOIN sales AS sales2 
    ON (sales.id_store=sales2.id_store)
 WHERE sales.date >= '2010-01-01' 
   AND sales.date <= '2010-01-10' 
   AND sales2.date >= '2009-01-01' 
   AND sales2.date <= '2009-01-10' 
ORDER BY sales.id_store ASC, sales.date ASC, sales2.date ASC

What am I missing?

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-14T06:50:42+00:00Added an answer on May 14, 2026 at 6:50 am

    Using IBM Informix Dynamic Server 11.50.FC6, I can use this SQL sequence to get the result you require:

    Setup

    CREATE TABLE sales
    (
        id       INTEGER NOT NULL,
        id_store INTEGER NOT NULL,
        date     DATE NOT NULL,
        total    DECIMAL(10,2) NOT NULL
    );
    
    INSERT INTO sales VALUES( 1, 1, '2010-01-01', 500.00);
    INSERT INTO sales VALUES( 2, 1, '2010-01-02', 185.00);
    INSERT INTO sales VALUES( 3, 1, '2010-01-03', 135.00);
    INSERT INTO sales VALUES( 4, 1, '2009-01-01', 165.00);
    INSERT INTO sales VALUES( 5, 1, '2009-01-02', 175.00);
    INSERT INTO sales VALUES( 6, 5, '2010-01-01', 130.00);
    INSERT INTO sales VALUES( 7, 5, '2010-01-02', 135.00);
    INSERT INTO sales VALUES( 8, 5, '2010-01-03', 130.00);
    INSERT INTO sales VALUES( 9, 6, '2010-01-01', 100.00);
    INSERT INTO sales VALUES(10, 6, '2010-01-02',  12.00);
    INSERT INTO sales VALUES(11, 6, '2010-01-03',  85.00);
    INSERT INTO sales VALUES(12, 6, '2009-01-01', 135.00);
    INSERT INTO sales VALUES(13, 6, '2009-01-02', 400.00);
    INSERT INTO sales VALUES(14, 6, '2009-01-07',  21.00);
    INSERT INTO sales VALUES(15, 6, '2009-01-08',  45.00);
    INSERT INTO sales VALUES(16, 8, '2009-01-09', 123.00);
    INSERT INTO sales VALUES(17, 8, '2009-01-10', 581.00);
    

    Query

    SELECT *
      FROM (SELECT s1.id AS s1id,
                   NVL(s1.id_store, s2.id_store) AS s1store,
                   NVL(s1.date, MDY(MONTH(s2.date), DAY(s2.date),
                                    YEAR(s2.date)+1)) AS s1date,
                   s1.total AS s1total,
                   s2.id AS s2id,
                   NVL(s2.id_store, s1.id_store) AS s2store,
                   NVL(s2.date, MDY(MONTH(s1.date), DAY(s1.date),
                                    YEAR(s1.date)-1)) AS s2date,
                   s2.total AS s2total
              FROM sales AS s1 FULL JOIN sales AS s2
                ON s1.id_store = s2.id_store
               AND s1.date BETWEEN '2010-01-01' AND '2010-01-10'
               AND s2.date BETWEEN '2009-01-01' AND '2009-01-10'
               AND DAY(s1.date)   = DAY(s2.date)
               AND MONTH(s1.date) = MONTH(s2.date)
           ) AS s3
     WHERE s1_date BETWEEN '2010-01-01' AND '2010-01-10'
       AND s2_date BETWEEN '2009-01-01' AND '2009-01-10'
     ORDER BY s1_id_store ASC, s1_date ASC;
    

    Result

    s1id s1store  s1date     s1total  s2id s2store  s2date     s2total
     1       1    2010-01-01  500.00   4       1    2009-01-01  165.00
     2       1    2010-01-02  185.00   5       1    2009-01-02  175.00
     3       1    2010-01-03  135.00           1    2009-01-03             
     6       5    2010-01-01  130.00           5    2009-01-01             
     7       5    2010-01-02  135.00           5    2009-01-02             
     8       5    2010-01-03  130.00           5    2009-01-03             
     9       6    2010-01-01  100.00  12       6    2009-01-01  135.00
    10       6    2010-01-02   12.00  13       6    2009-01-02  400.00
    11       6    2010-01-03   85.00           6    2009-01-03             
             6    2010-01-07          14       6    2009-01-07   21.00
             6    2010-01-08          15       6    2009-01-08   45.00
             8    2010-01-09          16       8    2009-01-09  123.00
             8    2010-01-10          17       8    2009-01-10  581.00
    

    Explanation

    It took a fair amount of experimentation to get this ‘right’. Informix has a DATE constructor function MDY() which takes three integer arguments: the month, day and year (the name is mnemonic). It also has three analysis functions: DAY(), MONTH() and YEAR() which return the day, month and year of the date argument. The inner query with the FULL JOIN gives you the results with nulls on both left and right sides. The 5-part criterion in the ON clause seems to be necessary; otherwise, the criteria in the outer query has to be more complex and confusing – if it can be made to work at all. Then the criteria in the outer selection ensure that the right data is chosen. One advantage of the NVL() expressions in the inner query is that the store ID columns are both the same and not null and neither date column is null, so the order by clause can be simpler – on store ID and either date column.

    In Informix, it would also be possible to to rework the date expressions as:

    NVL(s1.date, s2.date + 1 UNITS YEAR)
    NVL(s2.date, s1.date - 1 UNITS YEAR)
    

    There are actually multiple type conversions going on behind the scenes with that notation, but it gives you the same result and the extra calculation is probably not all that significant.

    There is also a glitch in waiting in Informix; you cannot add or subtract 1 year to or from any February 29th – because there is no 29th February in the following or previous year. You would need to be careful with your data; if you’re not, you could end up comparing the data for 2008-02-29 with 2009-02-28 (as well as comparing the data for 2008-02-28 with 2009-02-28). There is a process called ‘double entry bookkeeping’, but this isn’t what is meant by it, and your computations could be confused if ‘2008-02-29 plus 1 year’ is 2009-02-28. Informix generates an error; that isn’t very much more helpful. You might code a stored procedure, probably, to return NULL for 2008-02-29 plus 1 year since there isn’t any date to compare its sales with.

    You should be able to adapt the date arithmetic to MySQL fairly easily; the rest of the code does not need to to change.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Ask A Question

Stats

  • Questions 384k
  • Answers 384k
  • Best Answers 0
  • User 1
  • Popular
  • Answers
  • Editorial Team

    How to approach applying for a job at a company ...

    • 7 Answers
  • Editorial Team

    What is a programmer’s life like?

    • 5 Answers
  • Editorial Team

    How to handle personal stress caused by utterly incompetent and ...

    • 5 Answers
  • Editorial Team
    Editorial Team added an answer You can add an event listener with 'ended' as first… May 14, 2026 at 11:02 pm
  • Editorial Team
    Editorial Team added an answer Have a look at Determine and count unique values of… May 14, 2026 at 11:02 pm
  • Editorial Team
    Editorial Team added an answer Although not the best rule-of-thumb... In the absence of any… May 14, 2026 at 11:02 pm

Trending Tags

analytics british company computer developers django employee employer english facebook french google interview javascript language life php programmer programs salary

Top Members

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.