如何在没有" WITH"的情况下简化此查询。或SQL服务器上的子查询?

时间:2017-05-04 08:53:43

标签: sql sql-server

我的查询在我的仓库和商店中过滤了我的表格中的正库存。

我只需要取正值,如果其中一个值为正值,我只取这个值。

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

小提琴:http://rextester.com/RMSU6120

我的查询结果还可以,我需要知道如何在没有" WITH"的情况下简化此查询。或子查询?

编辑**

为什么我不需要WITH或SubQuery是因为我认为在这种情况下是过度的,我认为可以在没有WITH或子查询的情况下进行此查询。

5 个答案:

答案 0 :(得分:1)

CTE或子选择有什么问题?

以下是一些方法,应该是等效的:

- 使用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;

- 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;

- 如果我做对了,那么检查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;

答案 1 :(得分: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
    END AS StockMulti
FROM ArticleStock 
WHERE StockDepots > 0 or StockStores > 0
ORDER BY AR_Ref

请注意,原始case语句中的“else”永远不会被执行,因为您只使用其中一个值为>的行。我删除了它,因为它可能引起混淆。

答案 2 :(得分:0)

您可以直接在where where条件中使用:

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

答案 3 :(得分:0)

您可以将数据推送到history.replaceState(),然后以简单的方式使用该表。

Temp Table

答案 4 :(得分:-1)

试试这个:

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