w3resource

AdventureWorks Database: Specify which groups to include in the results

SQL Query - AdventureWorks: Exercise-18 with Solution

18. From the following table write a query in SQL to retrieve the total sales for each year. Filter the result set for those orders where order year is on or before 2016. Return the year part of orderdate and total due amount. Sort the result in ascending order on year part of order date.

Sample table: Sales.SalesOrderHeader
salesorderid|revisionnumber|orderdate              |duedate                |shipdate               |status|onlineorderflag|purchaseordernumber|accountnumber |customerid|salespersonid|territoryid|billtoaddressid|shiptoaddressid|shipmethodid|creditcardid|creditcardapprovalcode|currencyrateid|subtotal   |taxamt    |freight  |totaldue   |comment|rowguid                             |modifieddate           |
------------+--------------+-----------------------+-----------------------+-----------------------+------+---------------+-------------------+--------------+----------+-------------+-----------+---------------+---------------+------------+------------+----------------------+--------------+-----------+----------+---------+-----------+-------+------------------------------------+-----------------------+
       43659|             8|2011-05-31 00:00:00.000|2011-06-12 00:00:00.000|2011-06-07 00:00:00.000|     5|false          |PO522145787        |10-4020-000676|     29825|          279|          5|            985|            985|           5|       16281|105041Vi84182         |              | 20565.6206| 1971.5149| 616.0984| 23153.2339|       |79b65321-39ca-4115-9cba-8fe0903e12e6|2011-06-07 00:00:00.000|
       43660|             8|2011-05-31 00:00:00.000|2011-06-12 00:00:00.000|2011-06-07 00:00:00.000|     5|false          |PO18850127500      |10-4020-000117|     29672|          279|          5|            921|            921|           5|        5618|115213Vi29411         |              |  1294.2529|  124.2483|  38.8276|  1457.3288|       |738dc42d-d03b-48a1-9822-f95a67ea7389|2011-06-07 00:00:00.000|
       43661|             8|2011-05-31 00:00:00.000|2011-06-12 00:00:00.000|2011-06-07 00:00:00.000|     5|false          |PO18473189620      |10-4020-000442|     29734|          282|          6|            517|            517|           5|        1346|85274Vi6854           |             4| 32726.4786| 3153.7696|  985.553| 36865.8012|       |d91b9131-18a4-4a11-bc3a-90b6f53e9d74|2011-06-07 00:00:00.000|
       43662|             8|2011-05-31 00:00:00.000|2011-06-12 00:00:00.000|2011-06-07 00:00:00.000|     5|false          |PO18444174044      |10-4020-000227|     29994|          282|          6|            482|            482|           5|       10456|125295Vi53935         |             4| 28832.5289| 2775.1646| 867.2389| 32474.9324|       |4a1ecfc0-cc3a-4740-b028-1c50bb48711c|2011-06-07 00:00:00.000|
       43663|             8|2011-05-31 00:00:00.000|2011-06-12 00:00:00.000|2011-06-07 00:00:00.000|     5|false          |PO18009186470      |10-4020-000510|     29565|          276|          4|           1073|           1073|           5|        4322|45303Vi22691          |              |   419.4589|   40.2681|  12.5838|   472.3108|       |9b1e7a40-6ae0-4ad3-811c-a64951857c4b|2011-06-07 00:00:00.000|
       43664|             8|2011-05-31 00:00:00.000|2011-06-12 00:00:00.000|2011-06-07 00:00:00.000|     5|false          |PO16617121983      |10-4020-000397|     29898|          280|          1|            876|            876|           5|         806|95555Vi4081           |              | 24432.6088| 2344.9921|   732.81| 27510.4109|       |22a8a5da-8c22-42ad-9241-839489b6ef0d|2011-06-07 00:00:00.000|
       43665|             8|2011-05-31 00:00:00.000|2011-06-12 00:00:00.000|2011-06-07 00:00:00.000|     5|false          |PO16588191572      |10-4020-000146|     29580|          283|          1|            849|            849|           5|       15232|35568Vi78804          |              | 14352.7713| 1375.9427| 429.9821| 16158.6961|       |5602c304-853c-43d7-9e79-76e320d476cf|2011-06-07 00:00:00.000|
	   -- more --

Click to view Full table

Sample Solution:

-- Selecting the year from the OrderDate and calculating the total due order amount for each year up to and including 2016
SELECT DATE_PART('year',OrderDate) AS YearOfOrderDate  
    ,SUM(TotalDue) AS TotalDueOrder  
-- Retrieving data from the 'SalesOrderHeader' table
FROM Sales.SalesOrderHeader  
-- Grouping the results by the year extracted from the OrderDate
GROUP BY DATE_PART('year',OrderDate)  
-- Filtering the results to include only years up to and including 2016
HAVING DATE_PART('year',OrderDate) <= '2016'  
-- Ordering the results by the year extracted from the OrderDate
ORDER BY DATE_PART('year',OrderDate);

Explanation:

  • The SELECT statement extracts the year from the OrderDate and calculates the total due order amount for each year.
  • DATE_PART('year',OrderDate) AS YearOfOrderDate extracts the year from the OrderDate and aliases it as "YearOfOrderDate".
  • SUM(TotalDue) AS TotalDueOrder calculates the total due order amount for each year and aliases it as "TotalDueOrder".
  • The FROM clause specifies the 'SalesOrderHeader' table from which data is retrieved.
  • The GROUP BY clause groups the results by the year extracted from the OrderDate.
  • The HAVING clause filters the results to include only years up to and including 2016.
  • The ORDER BY clause orders the results by the year extracted from the OrderDate.

Sample Output:

yearoforderdate|totaldueorder|
---------------+-------------+
         2011.0|14155699.5250|
         2012.0|37675700.3120|
         2013.0|48965887.9632|
         2014.0|22419498.3157|

SQL AdventureWorks Editor:

Practice Online


Contribute your code and comments through Disqus.

Previous: Sales by year using GROUP BY with an expression.
Next: Contacts designated as a manager.

What is the difficulty level of this exercise?

Test your Programming skills with w3resource's quiz.



Follow us on Facebook and Twitter for latest update.