• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 415
  • Last Modified:

SQL - combine queries without using UNION ALL

How can I combine the queries below without using UNIION ALL?
 
 SELECT ORDERS.orderid,
INVENTORY.partid,
Inventory.description,
ORDERITEMS.qty,
 Inventory.price,
 (OrderItems.qty * Inventory.price) AS 'Total Original Price',
 
 -----If an order contains ten or more units of a given product, give a 5% discount on that line item.

 (OrderItems.qty * Inventory.price *
CASE WHEN OrderItems.qty >=10 THEN 0.05 END) AS 'Total Discount Value' ,

----Get Total_Final_Price_After_Discount

 OrderItems.qty * Inventory.price - (OrderItems.qty * Inventory.price *
CASE WHEN OrderItems.qty >=10 THEN 0.05 END) AS 'Total_Final_Price_After_Discount'

FROM orders, inventory, orderitems
 WHERE ORDERS.ORDERID = ORDERITEMS.ORDERID AND ORDERITEMS.PARTID = INVENTORY.PARTID
 AND ORDERITEMS.qty >=10

 UNION ALL

 SELECT ORDERS.orderid,
INVENTORY.partid,
Inventory.description,
ORDERITEMS.qty,
 Inventory.price,
 (OrderItems.qty * Inventory.price) as 'Total Original Price',
 
----If an order contains five or more units of a given product, give a 2% discount for that line item.

(OrderItems.qty * Inventory.price *
CASE WHEN OrderItems.qty < 10 THEN 0.2 END) as 'Total Discounted Value',

----Get Total_Final_Price_After_Discount

 OrderItems.qty * Inventory.price - (OrderItems.qty * Inventory.price *
CASE WHEN OrderItems.qty < 10 THEN 0.2 END) AS 'Total_Final_Price_After_Discount'
 
 FROM orders, inventory, orderitems
 WHERE ORDERS.ORDERID = ORDERITEMS.ORDERID AND ORDERITEMS.PARTID = INVENTORY.PARTID
 AND ORDERITEMS.qty BETWEEN 5 AND 9
 ORDER BY ORDERS.orderid, INVENTORY.partid
0
ocdc
Asked:
ocdc
  • 4
  • 3
1 Solution
 
David ToddSenior DBACommented:
Hi,

Can you explain why you don't want to use union all?

Regards
  David
0
 
ocdcAuthor Commented:
would like to use CASE Statement only.   Also how can I  add STR   function for formatting dollar amounts  with two decimal place?  Thank you.

 CASE WHEN OrderItems.qty >=10 THEN 0.05 END) AS 'Total_Final_Price_After_Discount'
0
 
David ToddSenior DBACommented:
Hi,

Does this help?

I reformatted your select so it was readable and added this line to each case statement
else 0.00

SELECT 
	ORDERS.orderid
	, INVENTORY.partid
	, Inventory.description
	, ORDERITEMS.qty
	, Inventory.price
	, (OrderItems.qty * Inventory.price) AS 'Total Original Price'
  
	-----If an order contains ten or more units of a given product, give a 5% discount on that line item.

	, (
		OrderItems.qty 
		* Inventory.price 
		* CASE 
			WHEN OrderItems.qty >=10 THEN 0.05 
			-- added line
			else 0.00
		END
		) AS 'Total Discount Value'

	----Get Total_Final_Price_After_Discount

	, OrderItems.qty 
		* Inventory.price 
		- (
			OrderItems.qty 
			* Inventory.price 
			* CASE 
				WHEN OrdeItems.qty >=10 THEN 0.05 
				-- added line
				else 0.00
			END
		) AS 'Total_Final_Price_After_Discount' 

Open in new window

HTH
  David
0
Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 
ocdcAuthor Commented:
I combined it as follows:  I get  5% and 2% discount as output for each item.   That is fine but  I need to format the Dollar values of  the  output columns.  Example: I am getting 10.000 which is correct . I need to format it to 10.00.

 So How can I format   OrderItems.qty
            * Inventory.price
            * CASE
                  WHEN OrderItems.qty >=10 THEN 0.05
                  -- added line
                  else 0.00
            END
            ) AS 'Total Discount Value'



SELECT
      ORDERS.orderid
      , INVENTORY.partid
      , Inventory.description
      , ORDERITEMS.qty
      , Inventory.price AS 'Unit price'
      , (OrderItems.qty * Inventory.price) AS 'Original Cost'
 
      -----If an order contains ten or more units of a given product, give a 5% discount on that line item.

      , (
            OrderItems.qty
            * Inventory.price
            * CASE
                  WHEN OrderItems.qty >=10 THEN 0.05
                  -- added line
                  else 0.00
            END
            ) AS 'Total Discount Value'

      ----Final Cost

      , OrderItems.qty
            * Inventory.price
            - (
                  OrderItems.qty
                  * Inventory.price
                  * CASE
                        WHEN OrderItems.qty >=10 THEN 0.05
                        -- added line
                        else 0.00
                  END
            ) AS 'Final Cost'  
            
            FROM ORDERS, INVENTORY, ORDERITEMS
 WHERE ORDERS.OrderID = ORDERITEMS.OrderID  AND ORDERITEMS.PartID = INVENTORY.PartID
 AND ORDERITEMS.qty >=10
 ORDER BY ORDERS.OrderId, INVENTORY.PartId
 
 UNION ALL
 
 SELECT
      ORDERS.orderid
      , INVENTORY.partid
      , Inventory.description
      , ORDERITEMS.qty
      , Inventory.price AS 'Unit price'
      , (OrderItems.qty * Inventory.price) AS 'Original Cost'
 
      -----If an order contains ten or more units of a given product, give a 5% discount on that line item.

      , (
            OrderItems.qty
            * Inventory.price
            * CASE
                  WHEN OrderItems.qty < 10 THEN 0.2
                  -- added line
                  else 0.00
            END
            ) AS 'Total Discount Value'

      ----Get Total_Final_Price_After_Discount

      , OrderItems.qty
            * Inventory.price
            - (
                  OrderItems.qty
                  * Inventory.price
                  * CASE
                        WHEN OrderItems.qty < 10 THEN 0.2
                        -- added line
                        else 0.00
                  END
            ) AS 'Final Cost'  
            
            FROM ORDERS, INVENTORY, ORDERITEMS
 WHERE ORDERS.OrderID = ORDERITEMS.OrderID  AND ORDERITEMS.PartID = INVENTORY.PartID
  AND ORDERITEMS.qty BETWEEN 5  AND  9
 ORDER BY ORDERS.OrderId, INVENTORY.PartId
0
 
David ToddSenior DBACommented:
Hi

With the lines I added to the case, loose the where clause, and loose the union all.

Formatting is something best left to presentation layer - excel, SSRS, web, application, etched.

Hth
  David
0
 
ocdcAuthor Commented:
Hi,

you only did -----If an order contains ten or more units of a given product, give a 5% discount

I also need one  for -----If an order contains 5 or more units of a given product, give a 2% discount.  And need to combine both in the CASE statement.  

As far as formatting is concern, I need to format the output columns to 2 decimal.    Thank you
 for your help.
0
 
David ToddSenior DBACommented:
Hi

You should be able to add the 5+ Line into the case - they are evaluated top to bottom so test for 10+ then 5-10 etc.

Regards
  David
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Cloud Class® Course: Ruby Fundamentals

This course will introduce you to Ruby, as well as teach you about classes, methods, variables, data structures, loops, enumerable methods, and finishing touches.

  • 4
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now