简体   繁体   中英

How can I simplify this query without “WITH” or Subquery on SQL server?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM