복붙노트

[SQL] 나는 SELECT 쿼리에서 계산 필드를 다시 사용할 수 있습니까?

SQL

나는 SELECT 쿼리에서 계산 필드를 다시 사용할 수 있습니까?

MySQL의 문 내에서 계산 필드를 다시 사용할 수있는 방법이 있나요. 나는에 대한 오류 "알 수없는 열 total_sale"를 얻을 :

SELECT 
    s.f1 + s.f2 as total_sale, 
    s.f1 / total_sale as f1_percent
FROM sales s

또는 나는 내가 필요한 모든 계산을 추가 한 경우 매우 긴 SQL 문에 대해 만들 것 계산을 반복해야합니까.

SELECT 
    s.f1 + s.f2 as total_sale, 
    s.f1 / (s.f1 + s.f2) as f1_percent
FROM sales s

물론 나는 나의 PHP 프로그램의 모든 계산을 할 수 있습니다.

해결법

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

    1.예, 변수를 재사용 할 수 있습니다. 이것은 당신이 그것을하는 방법이다 :

    예, 변수를 재사용 할 수 있습니다. 이것은 당신이 그것을하는 방법이다 :

    SELECT 
        @total_sale := s.f1 + s.f2 as total_sale, 
        s.f1 / @total_sale as f1_percent
    FROM sales s
    

    여기에 대해 자세히 알아보기 : http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

    [참고 :이 동작은 정의되지 않는다. MySQL의 문서에 따르면 :]

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

    2.다음은 MySQL의 5.5에 내 테스트에서 잘 작동하는 것 같다 :

    다음은 MySQL의 5.5에 내 테스트에서 잘 작동하는 것 같다 :

    SELECT 
        s.f1 + s.f2 as total_sale, 
        s.f1 / (SELECT total_sale) as f1_percent
    FROM sales s
    
  3. ==============================

    3.전용 크로스 플랫폼 지원 수단은 파생 테이블 / 인라인 뷰를 사용하는 것이다 :

    전용 크로스 플랫폼 지원 수단은 파생 테이블 / 인라인 뷰를 사용하는 것이다 :

    SELECT x.total_sale,
           x.f1 / x.total_sale as f1_percent
      FROM (SELECT s.f1,
                   s.f1 + s.f2 as total_sale, 
              FROM sales s) x
    
  4. ==============================

    4.당신이 사용할 수있는 서브 - 선택 :

    당신이 사용할 수있는 서브 - 선택 :

    select tbl1.total_sale,
           tbl1.f1/tbl1.total_sale as f1_percent 
      from (select s.f1+s.f2 AS total_sale, 
                   s.f1 
              from sales s) as tbl1;
    
  5. ==============================

    5.이 같은 하위 쿼리를 사용할 수 있습니다 :

    이 같은 하위 쿼리를 사용할 수 있습니다 :

    SELECT 
        h.total_sale, 
        s.f1 / h.total_sale AS f1_percent
    FROM sales s,
        (SELECT id, f1 + f2 AS total_sale FROM sales) h
    WHERE
        s.id = h.id
    

    편집하다: 기본 키 가정 고정 직교 제품은 ID이다. 이 최적화 후 OMG 조랑말 '솔루션에 해당해야한다,하지만 난 당신이 더 하위 쿼리가 필요한 경우 읽기 어렵게 될 것이라 생각합니다.

  6. ==============================

    6.여기 다양한 답변을 살펴했고, 몇 가지 실험을했다.

    여기 다양한 답변을 살펴했고, 몇 가지 실험을했다.

    특히 나는 MariaDB 10.1을 사용하고 있습니다.

    는 "간단한"우선 당신은 로버트 D 그의 의견에 무엇을 제안 할 수있다 :

    SELECT Price_Per_SqFt, (Price_Per_SqFt/2) AS col1, (SELECT col1 + 1) AS col2 FROM Items 
    

    당신이 내부로 집계 함수의 일종을 사용하는 경우 금융 데이터 통화 (NB VAT = "판매 세"를 다음과 같이 접근 방식을 결합 당신이 사용할 수 있지만 내부에이 방법을 결합 할 수 있습니다 가입 ... 그리고 NB 필드는 일반적으로 4 소수점을 가지고, 내가) ... 그것은 역사적인 생각

    SELECT 
        invoices.invoiceNo, invoices.clientID, invoices.Date, invoices.Paid, 
      invoicesWithSubtotal.Subtotal,
      ROUND( CAST( Subtotal * invoices.VATRate AS DECIMAL( 10, 4 )), 2 ) AS VAT,
      (SELECT VAT + Subtotal) AS Total
    FROM invoices 
        INNER JOIN 
        ( SELECT Sum( invoiceitems.Charge ) AS Subtotal, invoices.InvoiceNo FROM invoices 
            INNER JOIN invoiceitems ON invoices.InvoiceNo = invoiceitems.InvoiceNo
                GROUP BY invoices.InvoiceNo ) invoicesWithSubtotal
        ON invoices.InvoiceNo = invoicesWithSubtotal.InvoiceNo
    

    내가 그들의 합계, 부가가치세 및 합계와 목록 송장에보기를 만들 수 위의를 사용하고 싶었 ... 그것은 MariaDB (그리고 거의 확실 MySQL은) FROM 절에 중첩 허용하지 않는 것이 밝혀졌다. 그러나이 용이하고 InvoiceNo 소계 나열된 첫 번째보기를 제작하고있는 참조 첫 번째 뷰함으로써 해결된다. 성능 현명한 나는 더블보기 배열의 종류에 대해 전혀 생각이 없다.

  7. ==============================

    7.나는 값이 아닌 문자열로서 변수의 @total_sales을 미리 정의했으며, 선택시 유형을 다시 정의하지 않았기 때문에 나는 다음과 같은 테스트되었고,이 모든 시간을 작동하는 것 같다, 아마 이것에 대한 이유가, 그 것이다 문 ??

    나는 값이 아닌 문자열로서 변수의 @total_sales을 미리 정의했으며, 선택시 유형을 다시 정의하지 않았기 때문에 나는 다음과 같은 테스트되었고,이 모든 시간을 작동하는 것 같다, 아마 이것에 대한 이유가, 그 것이다 문 ??

    나는 다음을 수행하는 경우

        set @total_sales = 0;
    
        SELECT 
           @total_sale := s.f1 + s.f2 as total_sale, 
          s.f1 / @total_sale as f1_percent
       FROM sales s
    
  8. from https://stackoverflow.com/questions/6085443/can-i-reuse-a-calculated-field-in-a-select-query by cc-by-sa and MIT license