복붙노트

[SQL] 어떻게 내가 어디 절에 별칭을 사용합니까? [복제]

SQL

어떻게 내가 어디 절에 별칭을 사용합니까? [복제]

   SELECT
Trade.TradeId, 
Isnull(Securities.SecurityType,'Other') SecurityType, 
TableName,
CASE 
WHEN 
SecurityTrade.SecurityId IS NOT NULL  
THEN 
SecurityTrade.SecurityId
ELSE 
Trade.SecurityId
END AS PricingSecurityID,
sum(Trade.Quantity)OVER(Partition by Securities.SecurityType, SecurityTrade.SecurityId,Trade.Price, Buy,Long ) as sumQuantity,
--added porfolio id for Getsumofqantity
Trade.PortfolioId,

Trade.Price,
case
when (Buy = 1 and Long = 1) then 1
when (Buy = 0 and Long = 0) then 1
else 0
end Position
from
Fireball_Reporting..Trade

where porfolioid =5 and Position =1   

난 경우의 별칭 내 where 절에 위치 = 1을 사용하려면

case
when (Buy = 1 and Long = 1) then 1
when (Buy = 0 and Long = 0) then 1
else 0
end Position

어떻게 내가이 곳 절에서 사용할 수 있습니까?

내가 직접 where 절에서 그 CASE 문을 사용했지만 실패 시도 저를 도와주세요

WHERE Trade.SecurityId = @SecurityId AND PortfolioId = @GHPortfolioID AND
                (case when (Buy = 1 and Long = 1) then 1 when (Buy = 0 and Long = 0) then 1 else 0 end Position = 1)

해결법

  1. ==============================

    1.는 SQL - 서버 문서는 말합니다 :

    는 SQL - 서버 문서는 말합니다 :

    MySQL의 문서에 비슷한는 말합니다 :

    MySQL의에서 당신은 수있는 SELECT 절에 이상 재사용 별칭에서

  2. ==============================

    2.당신은 직접적으로, 할 수 없습니다.

    당신은 직접적으로, 할 수 없습니다.

    당신이 하위 쿼리에서 전체 쿼리를 포장하는 경우, 그러나, 그것을 잘 작동합니다.

    SELECT
      *
    FROM
    (
      SELECT
        Trade.TradeId, 
        Isnull(Securities.SecurityType,'Other') SecurityType, 
        TableName,
        CASE 
          WHEN SecurityTrade.SecurityId IS NOT NULL THEN SecurityTrade.SecurityId
                                                    ELSE Trade.SecurityId
        END AS PricingSecurityID,
        sum(Trade.Quantity)OVER(Partition by Securities.SecurityType,
        SecurityTrade.SecurityId,Trade.Price, Buy,Long ) as sumQuantity,
        --added porfolio id for Getsumofqantity
        Trade.PortfolioId,
        Trade.Price,
        case
          when (Buy = 1 and Long = 1) then 1
          when (Buy = 0 and Long = 0) then 1
                                      else 0
        end Position
      from
        Fireball_Reporting..Trade
      where
        porfolioid = 5
    )
      AS data
    WHERE
      Position = 1   
    

    당신이 WHERE 절에 CASE 문을 반복 할 필요가 없습니다 것을이 의미합니다. (유지 보수성 및 DRY).

    그것은 또한 당신이 단순히 WHERE 절에 자신을 반복 것처럼 옵티마이 행동 할 수있는 구조입니다.

    또한 다른 RDBMS에 매우 휴대용입니다.

    SQL Server에서 당신은 또한 다른 옵션을 가지고 ...

    SELECT
      Trade.TradeId, 
      Isnull(Securities.SecurityType,'Other') SecurityType, 
      TableName,
      CASE 
        WHEN SecurityTrade.SecurityId IS NOT NULL THEN SecurityTrade.SecurityId
                                                  ELSE Trade.SecurityId
      END AS PricingSecurityID,
      sum(Trade.Quantity)OVER(Partition by Securities.SecurityType,
      SecurityTrade.SecurityId,Trade.Price, Buy,Long ) as sumQuantity,
      --added porfolio id for Getsumofqantity
      Trade.PortfolioId,
      Trade.Price,
      position.val AS Position
    from
      Fireball_Reporting..Trade
    CROSS APPLY
    (
      SELECT
        case
          when (Buy = 1 and Long = 1) then 1
          when (Buy = 0 and Long = 0) then 1
                                      else 0
        end AS val
    )
      AS position
    where
      porfolioid = 5
      AND position.val = 1
    
  3. ==============================

    3.직접이 작업을 수행 할 수 있습니다 ...하지만 당신은 모든 주위에 추가 선택을 감싸고 where 절을 사용할 수 있습니다 :

    직접이 작업을 수행 할 수 있습니다 ...하지만 당신은 모든 주위에 추가 선택을 감싸고 where 절을 사용할 수 있습니다 :

        select * from 
       (   SELECT
       Trade.TradeId, 
       Isnull(Securities.SecurityType,'Other') SecurityType, 
       TableName,
       CASE 
       WHEN 
       SecurityTrade.SecurityId IS NOT NULL  
       THEN 
       SecurityTrade.SecurityId
       ELSE 
       Trade.SecurityId
       END AS PricingSecurityID,
       sum(Trade.Quantity)OVER(Partition by Securities.SecurityType,       SecurityTrade.SecurityId,Trade.Price, Buy,Long ) as sumQuantity,
        --added porfolio id for Getsumofqantity
        Trade.PortfolioId,
         Trade.Price,
         case
         when (Buy = 1 and Long = 1) then 1
         when (Buy = 0 and Long = 0) then 1
         else 0
        end Position
        from
        Fireball_Reporting..Trade
        where porfolioid =5 and Position =1 
        )x
        where x.position = 1
    
  4. ==============================

    4.아마 뭔가를보고 싶어하지만, 확실히이 그것을 다룰 것입니다 :

    아마 뭔가를보고 싶어하지만, 확실히이 그것을 다룰 것입니다 :

    WHERE (주문 = 1, 긴 = 1) 또는 (판매 = 0 롱 = 0)

  5. from https://stackoverflow.com/questions/13031013/how-do-i-use-alias-in-where-clause by cc-by-sa and MIT license