복붙노트

[SQL] 왜 SQL에는 제품 집계 함수가 없다?

SQL

왜 SQL에는 제품 집계 함수가 없다?

임 SUM 작동하는 방법과 유사 table.sale BY 테이블 그룹에서 SELECT 제품 (table.price) 같은 뭔가를 찾고.

유무 나 문서에 뭔가를 놓친, 또는 정말 어떤 제품 기능이 없다?

그렇다면, 왜?

참고 : 나는 포스트 그레스, MySQL과 MSSQL에서 함수를 찾았다 나는 모든 SQL를 지원하지 않는 가정, 그래서 아무도 찾을 수 없습니다.

해결법

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

    1.는 SQL 표준에는 제품의 설정 기능이 없습니다. (: 그것은 SQL을위한 좋은 적합이 아니다 예를 들어, 결과 데이터 유형이 다 치수를 포함와 관련하여 제 1 정규형으로 문제를 제기 것 CONCATENATE 설정 기능, 말과 달리)이 있지만, 가치있는 후보로 나타납니다.

    는 SQL 표준에는 제품의 설정 기능이 없습니다. (: 그것은 SQL을위한 좋은 적합이 아니다 예를 들어, 결과 데이터 유형이 다 치수를 포함와 관련하여 제 1 정규형으로 문제를 제기 것 CONCATENATE 설정 기능, 말과 달리)이 있지만, 가치있는 후보로 나타납니다.

    는 SQL 표준은 1990 년경 SQL 제품에서 기능을 통합하고 미래의 개발에 '생각의지도'를 제공하는 것을 목표로하고 있습니다. 즉, 그들은 SQL이 무엇을하고 SQL이 무엇을해야하는지 문서화합니다. 제품 설정 기능의 부재는 제안이 1990 년에 어떤 공급 업체 비록 포함의 가치 및 표준으로 도입에는 학문적 인 관심이 없었다.

    물론, 항상 일반적으로 표준보다는 tangentally에 확장명으로 자신의 기능을 추가하기 위해 이러한 일을 추구 한 납품업자. 내가 사용했던 SQL의 제품에 제품 설정 기능 (또는 심지어 수요)를보고 기억하지 않습니다.

    어떠한 경우에도, 일 주위 SUM 설정 기능 (핸들 및 네거티브 로직) 로그 및 EXP 스칼라 함수를 이용하여 매우 간단하다; 몇 가지 예제 코드 @ GBN의 답변을 참조하십시오. 나는하지만, 비즈니스 응용 프로그램에서이 작업을 수행하는 데 필요한 적이 없어요.

    결론적으로, 내 추측은 제품 설정 기능에 대한 SQL 최종 사용자로부터 수요가 없다는 것입니다; 또한, 학문적 관심이 그 사람은 아마 (즉, 제품의 설정 기능을 제공하는 것이 문법 설탕을 소중히 않을 것) 허용 해결 방법을 찾을 것입니다.

    밖으로 관심, 참 (도 및 표준 SQL) 새로운 기능에 있지만, 윈도우 함수의 다양한 사람들을 위해 SQL 서버 랜드가 요구된다. 더 운전 수요에 참여 방법 등 자세한 내용에 대해서는, Itzik 벤 웨이 코 뮤니시의 블로그를 참조하십시오.

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

    2.MSSQL 위해 당신은이를 사용할 수 있습니다. 그것은 다른 플랫폼에 채택 될 수있다 : 그것은 대수에 단지 수학 및 집계를합니다.

    MSSQL 위해 당신은이를 사용할 수 있습니다. 그것은 다른 플랫폼에 채택 될 수있다 : 그것은 대수에 단지 수학 및 집계를합니다.

    SELECT
        GrpID,
        CASE
           WHEN MinVal = 0 THEN 0
           WHEN Neg % 2 = 1 THEN -1 * EXP(ABSMult)
           ELSE EXP(ABSMult)
        END
    FROM
        (
        SELECT
           GrpID, 
           --log of +ve row values
           SUM(LOG(ABS(NULLIF(Value, 0)))) AS ABSMult,
           --count of -ve values. Even = +ve result.
           SUM(SIGN(CASE WHEN Value < 0 THEN 1 ELSE 0 END)) AS Neg,
           --anything * zero = zero
           MIN(ABS(Value)) AS MinVal
        FROM
           Mytable
        GROUP BY
           GrpID
        ) foo
    

    여기 내 대답에서 촬영 : SQL Server 쿼리 - GroupWise에 곱셈

  3. ==============================

    3.나는 일이없는 이유를 알고 있지만, 당신이해야 할 로그와 지수를 사용할 수 있습니다 (음수을 통해 더 조심)하지 않습니다 -

    나는 일이없는 이유를 알고 있지만, 당신이해야 할 로그와 지수를 사용할 수 있습니다 (음수을 통해 더 조심)하지 않습니다 -

    select exp (sum (ln (table.price))) from table ...
    
  4. ==============================

    4.당신은 제품 집계 기능을 수행 할 수 있지만 다음과 같이 수학을 직접 할 필요가 ...

    당신은 제품 집계 기능을 수행 할 수 있지만 다음과 같이 수학을 직접 할 필요가 ...

    SELECT
        Exp(Sum(IIf(Abs([Num])=0,0,Log(Abs([Num])))))*IIf(Min(Abs([Num]))=0,0,1)*(1-2*(Sum(IIf([Num]>=0,0,1)) Mod 2)) AS P
    FROM
       Table1
    

    출처 : http://productfunctionsql.codeplex.com/

  5. ==============================

    5.T-SQL에서 깔끔한 트릭이있다 (하지 않도록 경우의 ANSI) 하나 개의 변수에 행의 집합에서 CONCATENATE 문자열 값으로 할 수 있습니다. 그것뿐만 아니라 곱 작동 것 같습니다 :

    T-SQL에서 깔끔한 트릭이있다 (하지 않도록 경우의 ANSI) 하나 개의 변수에 행의 집합에서 CONCATENATE 문자열 값으로 할 수 있습니다. 그것뿐만 아니라 곱 작동 것 같습니다 :

    declare @Floats as table (value float)
    insert into @Floats values (0.9)
    insert into @Floats values (0.9)
    insert into @Floats values (0.9)
    
    declare @multiplier float = null
    
    select 
        @multiplier = isnull(@multiplier, '1') * value
    from @Floats
    
    select @multiplier
    

    이것은 잠재적으로 로그 / 특급 솔루션보다 더 많은 수치 적으로 안정 될 수 있습니다.

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

    6.나는 어떤 번호 체계는 많은 제품을 수용 할 수 없기 때문이라고 생각합니다. 데이터베이스가 기록의 많은 수의 설계로 1000 개 번호의 제품은 매우 거대하고 부동 소수의 경우에있을 것입니다, 전파 오류가 거대 할 것이다.

    나는 어떤 번호 체계는 많은 제품을 수용 할 수 없기 때문이라고 생각합니다. 데이터베이스가 기록의 많은 수의 설계로 1000 개 번호의 제품은 매우 거대하고 부동 소수의 경우에있을 것입니다, 전파 오류가 거대 할 것이다.

    또한 로그를 사용하는 것은 위험한 해결책이 될 수 있습니다. 수학적으로 로그인하지만 (A * B) = 로그 (A) * 우리가 실수를 처리하지 않는 한 로그 (B)가 컴퓨터에 없을 수도 있습니다. 대신 A * B의 2 ^ (로그 (A) + 로그 (B))를 계산하면 예기치 않은 결과가 발생할 수 있습니다. 예를 들면 :

    SELECT * 9999999999 99,999,999,974,482, EXP (LOG (9999999999) + LOG (99,999,999,974,482))

    SQL 서버 수익률

    999,999,999,644,820,000,025,518, P 0.99999999644812 J +23

    내 요점은 당신이 제품을하려고 할 때입니다 그래서 조심스럽게 그것을 테스트는 많이있다.

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

    7.(당신은 스크립트 언어로 작업하는 경우)이 문제를 해결하는 한 가지 방법은 GROUP_CONCAT 함수를 사용하는 것입니다. 예를 들어, table.sale BY 테이블 그룹에서 GROUP_CONCAT (table.price)를 선택

    (당신은 스크립트 언어로 작업하는 경우)이 문제를 해결하는 한 가지 방법은 GROUP_CONCAT 함수를 사용하는 것입니다. 예를 들어, table.sale BY 테이블 그룹에서 GROUP_CONCAT (table.price)를 선택

    이 쉼표로 구분하여 같은 판매 값에 대한 모든 가격을 가진 문자열을 반환합니다. 그런 다음 파서 각 가격을, 그리고 곱셈을 할 수 있습니다. (PHP에서 당신은 당신이 적절한 예를 얻을 php.net 매뉴얼에 사실, array_reduce 기능을 사용할 수 있습니다).

    건배

  8. ==============================

    8.사실에 근거 또 다른 방법은 직교 제품의 카디널리티는 특정 세트의 카디널리티의 제품입니다 ;-)

    사실에 근거 또 다른 방법은 직교 제품의 카디널리티는 특정 세트의 카디널리티의 제품입니다 ;-)

    ⚠ 경고 :이 예제는 그냥 재미 있고 오히려 학문적 인은 생산에 사용하지 마십시오! ⚠ (떨어져 사실 그냥 긍정적이고 실질적으로 작은 정수를 위해입니다)

    with recursive t(c) as (
      select unnest(array[2,5,7,8])
    ), p(a) as (
      select array_agg(c) from t
      union all
      select p.a[2:]
      from p
      cross join generate_series(1, p.a[1])
    )
    select count(*) from p where cardinality(a) = 0;
    
  9. ==============================

    9.문제는 현대 SQL을 사용하여 같은 윈도우 함수와 열팽창 계수와 같은 기능을 해결할 수있다. 달리 로그 기반 솔루션 - - 모든 표준 SQL과 인 점 세상을 떠도 정의 값이 아닌 숫자 처리에 정수의 세계로 전환 할 필요가 없습니다. 어떤 행이 남아 있지 않을 때까지 그냥 수 행과는 재귀 쿼리에 제품을 평가 :

    문제는 현대 SQL을 사용하여 같은 윈도우 함수와 열팽창 계수와 같은 기능을 해결할 수있다. 달리 로그 기반 솔루션 - - 모든 표준 SQL과 인 점 세상을 떠도 정의 값이 아닌 숫자 처리에 정수의 세계로 전환 할 필요가 없습니다. 어떤 행이 남아 있지 않을 때까지 그냥 수 행과는 재귀 쿼리에 제품을 평가 :

       with recursive t(c) as (
         select unnest(array[2,5,7,8])
       ), r(c,n) as (
         select t.c, row_number() over () from t
       ), p(c,n) as (
         select c, n from r where n = 1
         union all
         select r.c * p.c, r.n from p join r on p.n + 1 = r.n
       )
       select c from p where n = (select max(n) from p);
    

    귀하의 질문에 판매 열을 기준으로 그룹화 포함으로 상황이 조금 복잡 가지고 있지만 여전히 풀 수있다 :

       with recursive t(sale,price) as (
         select 'multiplication', 2 union
         select 'multiplication', 5 union
         select 'multiplication', 7 union
         select 'multiplication', 8 union
         select 'trivial', 1 union
         select 'trivial', 8 union
         select 'negatives work', -2 union
         select 'negatives work', -3 union
         select 'negatives work', -5 union
         select 'look ma, zero works too!', 1 union
         select 'look ma, zero works too!', 0 union
         select 'look ma, zero works too!', 2
       ), r(sale,price,n,maxn) as (
         select t.sale, t.price, row_number() over (partition by sale), count(1) over (partition by sale)
         from t
       ), p(sale,price,n,maxn) as (
         select sale, price, n, maxn
         from r where n = 1
         union all
         select p.sale, r.price * p.price, r.n, r.maxn
         from p
         join r on p.sale = r.sale and p.n + 1 = r.n
       )
       select sale, price
       from p
       where n = maxn
       order by sale;
    

    결과:

    sale,price
    "look ma, zero works too!",0
    multiplication,560
    negatives work,-30
    trivial,8
    

    포스트 그레스에서 테스트.

  10. from https://stackoverflow.com/questions/3912204/why-is-there-no-product-aggregate-function-in-sql by cc-by-sa and MIT license