음수 및 0 값을 포함하는 열의 행을 곱하는 방법은 무엇입니까?


10

쿼리별로 그룹화 된 특정 열에 대한 모든 행의 제품을 가져 오려고합니다. 나는 결합으로 점을 저를 발견했습니다 대부분의 예 exp, sum그리고log

exp(sum(log([Column A])))

내가 겪고있는 문제는 열에 값에 대한 0이 포함되어 있으므로 0이 log함수에 전달되면이 오류가 발생한다는 것입니다.

잘못된 부동 소수점 연산이 발생했습니다.

나는 case표현식 을 사용 하여이 문제를 해결할 수 있다고 생각 했지만 모든 경우를 평가하는 것처럼 생각 해야하는 방식으로 작동하지 않습니다 ...

select 
  Name,
  Product = case 
    when min([Value]) = 0 then 0 
    when min([Value]) <> 0 then exp(sum(log(I))) -- trying to get the product of all rows in this column
  end
 from ids
 group by Name

SqlFiddle

다음과 같은 결과 세트가 제공됩니다.

Id  Name  Value
_________________________________
1   a     1
2   a     2
3   b     0
4   b     1

다음 행을 얻을 것으로 예상됩니다.

Name  Product
_____________
a     2
b     0

요약하면 ... 음수 또는 0 값을 포함 할 수있는 열의 행을 어떻게 곱합니까?

답변:


13

NULLIF 의 마술은 귀하의 질문에서 테스트 사례에 대한 트릭을 수행하는 것 같습니다. SQL Fiddle과 다른 예제를 사용했기 때문에 그게 당신이 원하는 것인지 모르겠습니다.

CREATE TABLE dbo.Ids
(
    Id INT NOT NULL IDENTITY(1, 1),
    Value INT,
    Name NVARCHAR(3)
);
INSERT INTO dbo.Ids ( Name, Value )
VALUES ( 'a', 1 );
INSERT INTO dbo.Ids ( Name, Value )
VALUES ( 'a', 2 );
INSERT INTO dbo.Ids ( Name, Value )
VALUES ( 'b', 0 );
INSERT INTO dbo.Ids ( Name, Value )
VALUES ( 'b', 1 );

SELECT   Name,
         CASE WHEN MIN(Value) = 0 THEN 0
              WHEN MIN(Value) > 0 THEN EXP(SUM(LOG(NULLIF(Value, 0)))) -- trying to get the product of all rows in this column
         END AS Product
FROM     Ids
GROUP BY Name;

보고:

Name    Product
a       2
b       0

음수 및 기타 엣지를 처리하는보다 일반적인 솔루션이 필요한 경우 Scott Burkow 의 CLR 대 T-SQL의 제품 집계를 참조하십시오 . 이 기사의 T-SQL 구성은 다음과 같습니다.

EXP(SUM(LOG(NULLIF(ABS([Value]), 0))))
*
IIF(SUM(IIF([Value] = 0, 1, NULL)) > 0, 0, 1)
*
IIF(SUM(IIF([Value] < 0, 1, 0)) % 2 = 1, -1, 1)

CASE (Transact-SQL)CASE 설명서에서 원래 식이 예상대로 작동하지 않는 이유에 대해 설명합니다 (강조 추가).

스칼라 식 (스칼라를 반환하는 상관되지 않은 하위 쿼리 포함)에 대한 WHEN 조건의 평가 순서에만 의존해야 하며 집계 식 에는 적용 되지 않습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.