I've a query that filter my table for positive stock in my warehouse and stores.
I need to take only positive value and if one of values is positive I take this value only.
WITH Resultat AS
(
SELECT AR_Ref,StockDepots,StockStores,
CASE
WHEN StockDepots > 0 AND StockStores > 0 THEN StockDepots + StockStores
WHEN StockDepots > 0 THEN StockDepots
WHEN StockStores > 0 THEN StockStores
ELSE StockDepots + StockStores
END AS StockMulti
FROM ArticleStock
)
SELECT * FROM Resultat
WHERE StockMulti > 0
ORDER BY AR_Ref
Fiddle : http://rextester.com/RMSU6120
My query result is Ok, I need to know How can I simplify this query without "WITH" or Subquery ?
EDIT**
Why I don't need WITH or SubQuery is because I think is overkill in this case and I think it's possible to make this query without WITH or Subquery.
What's wrong with a CTE or a sub-select?
Here are some approaches, which should be equivalent:
--Uses row-wise calculation with CROSS APPLY
SELECT AR_Ref,StockDepots,StockStores
,ca.StockMulti
FROM ArticleStock
CROSS APPLY(SELECT CASE
WHEN StockDepots > 0 AND StockStores > 0 THEN StockDepots + StockStores
WHEN StockDepots > 0 THEN StockDepots
WHEN StockStores > 0 THEN StockStores
ELSE StockDepots + StockStores END) AS ca(StockMulti)
WHERE StockMulti > 0
ORDER BY AR_Ref;
--Doubles the CASE
SELECT AR_Ref,StockDepots,StockStores
,CASE
WHEN StockDepots > 0 AND StockStores > 0 THEN StockDepots + StockStores
WHEN StockDepots > 0 THEN StockDepots
WHEN StockStores > 0 THEN StockStores
ELSE StockDepots + StockStores END AS StockMulti
FROM ArticleStock
WHERE CASE
WHEN StockDepots > 0 AND StockStores > 0 THEN StockDepots + StockStores
WHEN StockDepots > 0 THEN StockDepots
WHEN StockStores > 0 THEN StockStores
ELSE StockDepots + StockStores END > 0
ORDER BY AR_Ref;
--If I get this right, it should be enough to check for WHERE StockStores > 0 OR StockDepots > 0
SELECT AR_Ref,StockDepots,StockStores
,CASE
WHEN StockDepots > 0 AND StockStores > 0 THEN StockDepots + StockStores
WHEN StockDepots > 0 THEN StockDepots
WHEN StockStores > 0 THEN StockStores
ELSE StockDepots + StockStores END AS StockMulti
FROM ArticleStock
WHERE StockStores > 0 OR StockDepots > 0
ORDER BY AR_Ref;
Well, you could do this:
SELECT AR_Ref,StockDepots,StockStores,
CASE
WHEN StockDepots > 0 AND StockStores > 0 THEN StockDepots + StockStores
WHEN StockDepots > 0 THEN StockDepots
WHEN StockStores > 0 THEN StockStores
END AS StockMulti
FROM ArticleStock
WHERE StockDepots > 0 or StockStores > 0
ORDER BY AR_Ref
Note that the "else" in the original case statement would never get exercised, because you are only using rows where one of the values is > 0. I removed it, as it may cause confusion.
You can use directly in where condition:
SELECT AR_Ref,StockDepots,StockStores,
CASE
WHEN StockDepots > 0 AND StockStores > 0 THEN StockDepots + StockStores
WHEN StockDepots > 0 THEN StockDepots
WHEN StockStores > 0 THEN StockStores
ELSE StockDepots + StockStores
END AS StockMulti
FROM ArticleStock
where (CASE
WHEN StockDepots > 0 AND StockStores > 0 THEN StockDepots + StockStores
WHEN StockDepots > 0 THEN StockDepots
WHEN StockStores > 0 THEN StockStores
ELSE StockDepots + StockStores
END) > 0
order by AR_Ref
You can push the data into a Temp Table
and then later use that table in a simple way.
SELECT AR_Ref,StockDepots,StockStores,
CASE
WHEN StockDepots > 0 AND StockStores > 0 THEN StockDepots + StockStores
WHEN StockDepots > 0 THEN StockDepots
WHEN StockStores > 0 THEN StockStores
ELSE StockDepots + StockStores
END AS StockMulti INTO #Test
FROM #ArticleStock
SELECT * FROM #Test WHERE StockMulti > 0
Try this:
SELECT * FROM
(
SELECT AR_Ref,StockDepots,StockStores,
CASE
WHEN StockDepots > 0 AND StockStores > 0 THEN StockDepots + StockStores
WHEN StockDepots > 0 THEN StockDepots
WHEN StockStores > 0 THEN StockStores
ELSE StockDepots + StockStores
END AS StockMulti
FROM ArticleStock
)
Resultat
WHERE StockMulti > 0
ORDER BY AR_Ref
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.