programing

SELECT 쿼리에서 계산된 필드를 재사용할 수 있습니까?

shortcode 2022. 10. 25. 21:12
반응형

SELECT 쿼리에서 계산된 필드를 재사용할 수 있습니까?

mysql 문 내에서 계산된 필드를 재사용할 수 있는 방법이 있습니까?다음 항목에 대해 "unknown column 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 프로그램에서 모든 계산을 할 수 있다.

예, 변수를 재사용할 수 있습니다.방법은 다음과 같습니다.

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 문서에 따르면:]

일반적으로 사용자 변수에 값을 할당하지 않고 동일한 문 내의 값을 읽으면 안 됩니다.예상한 결과를 얻을 수 있지만 이는 보장되지 않습니다.

MySQL 5.5에서의 테스트에서는 다음 사항이 잘 작동하는 것 같습니다.

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

크로스 플랫폼에서만 지원되는 방법은 파생된 테이블/인라인 뷰를 사용하는 것입니다.

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

하위 선택 항목을 사용할 수 있습니다.

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;

다음과 같이 서브쿼리를 사용할 수 있습니다.

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 Pornes 솔루션과 동등해야 하는데, 서브쿼리가 더 필요하시면 읽기 어려울 것 같습니다.

저는 여기서 여러 가지 답을 보고 몇 가지 실험을 해봤습니다.

구체적으로는 MariaDB 10.1을 사용하고 있습니다.

"간단한" 작업을 위해 Robert 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

저는 위의 내용을 사용해서View소계, 부가가치세, 총액과 함께 송장 일람표를 작성한다.MariaDB(및 거의 확실하게 MySQL)는 MariaDB에 네스트하는 것을 허용하지 않는 것으로 나타났습니다.FROM절을 클릭합니다.하지만 이것은 첫 번째로 만들어짐으로써 쉽게 해결될 수 있다.View이 리스트에는,InvoiceNo그리고.Subtotal, 그리고 두 번째를 만듭니다.View첫 번째를 언급하고 있습니다.성능 면에서는 이런 종류의 이중화에 대해 전혀 모릅니다.View배치.

다음 사항을 테스트해 봤는데 항상 작동하는 것 같습니다.아마 이유가 있을 거예요.변수 @total_sales를 문자열이 아닌 값으로 미리 정의하고 select 스테이트먼트 중에 유형을 재정의하지 않았기 때문일까요?

다음과 같이 하면

    set @total_sales = 0;

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

언급URL : https://stackoverflow.com/questions/6085443/can-i-reuse-a-calculated-field-in-a-select-query

반응형