2011-02-07 4 views
0

난에 데이터를 덤프하고 테이블 변수가 있습니다특정 레코드의 평균을 찾는 방법 T-SQL

DECLARE @TmpTbl_SKUs AS TABLE 
(
    Vendor VARCHAR (255), 
    Number VARCHAR(4), 
    SKU VARCHAR(20), 
    PurchaseOrderDate DATETIME, 
    LastReceivedDate DATETIME, 
    DaysDifference INT 
) 

일부 기록은 구매 주문 날짜 또는 마지막받은 날짜를 필요는 없습니다, 그래서 일 차이는 null입니다. 내부 조인을 많이 했었지만 데이터가 너무 오래 걸리는 것으로 보이거나 대부분 잘못된 시간이 나온다.

SKU 일별 평균을 구할 수 있습니까? 해당 SKU의 레코드가 하나만 있는지 어떻게 확인합니까? 데이터가 필요합니다. 레코드가 1 개인 경우 평균을 챔피언 레벨에서 찾아야합니다. 여기

는 구조입니다 :

공급 업체는 많은 숫자와 숫자가 많은 SKU를

, 나는이 일을 균열 수없는 것 어떤 도움이 좋을 것를 가지고도 나는이에 관련된 아무것도 찾을 수 있습니다 온라인. 미리 감사드립니다.

Vendor  Number SKU  PurchaseOrderDate    LastReceivedDate  DaysDifference 

OTHER PMDD  1111   OP1111 2009-08-21 00:00:00.000 2009-09-02 00:00:00.000 12 
OTHER PMDD  1111   OP1112 2009-12-09 00:00:00.000 2009-12-17 00:00:00.000 8 
MANTOR    3333   MA1111 2006-02-15 00:00:00.000 2006-02-23 00:00:00.000 8 
MANTOR    3333   MA1112 2006-02-15 00:00:00.000 2006-02-23 00:00:00.000 8 

내가이 잘못 쓴 수 있습니다 미안 해요 : 여기

는 일부 샘플 데이터입니다. 레코드에 SKU가 하나만 있으면 DaysDifference (null이 아닌 경우)를 반환하고 레코드가 두 개 이상이고 null이 아닌 경우 평균 일 차이를 반환합니다. 그것은 그렇지 않으면 그것은 단지 7을 반환해야하고 null이 아닌의 SKU의 평균에 대한 공급 업체 수준의 검사에서 모두 널 (null) 인 경우, 이것은 내가 시도 무엇이 함께 연주

SELECT t1.SKU, ISNULL 
(
    AVG(t1.DaysDifference), 
    (
     SELECT ISNULL(AVG(t2.DaysDifference), 7) 
     FROM @TmpTbl_SKUs t2 
     WHERE t2.SKU=t1.SKU 
     GROUP BY t2.ChampVendor, t2.VendorNumber, t2.SKU 
    ) 
) 
FROM @TmpTbl_SKUs t1 
GROUP BY t1.SKU 

에 보관할. 내가 가진 것은 다소 있지만, 여러 레코드가 있는지 확인하는 방법과 공급 업체 수준에서 확인하는 방법을 이해하지 못합니다.

+1

설명 텍스트를 실제로 따라하지 않습니다. 샘플 데이터 및 원하는 결과 행을 제공 할 수 있습니까? –

+0

또한 문제 해결에 대한 귀하의 시도를 게시 하시겠습니까? 그래서 우리는 당신을 위해 작동하지 않는 솔루션을 제공하려고하지 않았습니다. 또는 우리는 당신의 능력을 향상시키기 위해 할 수있는 일을 볼 수있었습니다. –

+0

죄송합니다. 나는 그것을 부분적으로 잘못 썼다. 그게 더 의미가 있기를 바랍니다. 내 쿼리는 검색하기에 너무 많은 레코드를 반환하기 때문에 어떤 점에서는 실패합니다. 그것은 나를 미치게합니다. – pqsk

답변

0

이 시도 :

편집 :가 널 (NULL)로 0을 치료하기 위해 NULLIF(..., 0)을 추가했다.

SELECT 
    t1.SKU, 
    COALESCE(
    NULLIF(AVG(t1.DaysDifference), 0), 
    NULLIF(t2.AvgDifferenceVendor, 0), 
    7 
) AS AvgDiff 
FROM @TmpTbl_SKUs t1 
    INNER JOIN (
    SELECT Vendor, AVG(DaysDifference) AS AvgDifferenceVendor 
    FROM @TmpTbl_SKUs 
    GROUP BY Vendor 
) t2 ON t1.Vendor = t2.Vendor 
GROUP BY t1.SKU, t2.AvgDifferenceVendor 

편집 2 : 나는 스크립트를 테스트하는 방법.

테스트를 위해 질문과 함께 게시 된 샘플 데이터를 사용하고 있습니다.

DECLARE @TmpTbl_SKUs AS TABLE 
(
    Vendor VARCHAR (255), 
    Number VARCHAR(4), 
    SKU VARCHAR(20), 
    PurchaseOrderDate DATETIME, 
    LastReceivedDate DATETIME, 
    DaysDifference INT 
) 

INSERT INTO @TmpTbl_SKUs 
     (Vendor,  Number, SKU,  PurchaseOrderDate,   LastReceivedDate, DaysDifference) 
SELECT 'OTHER PMDD', '1111', 'OP1111', '2009-08-21 00:00:00.000', '2009-09-02 00:00:00.000', 12 
UNION ALL 
SELECT 'OTHER PMDD', '1111', 'OP1112', '2009-12-09 00:00:00.000', '2009-12-17 00:00:00.000', 8 
UNION ALL 
SELECT 'MANTOR',  '3333', 'MA1111', '2006-02-15 00:00:00.000', '2006-02-23 00:00:00.000', 8 
UNION ALL 
SELECT 'MANTOR',  '3333', 'MA1112', '2006-02-15 00:00:00.000', '2006-02-23 00:00:00.000', 8; 

먼저 수정되지 않은 데이터로 스크립트를 실행합니다. 각 당 오직 하나의 행이 때문에 모든 SKU를위한

SKU     AvgDiff 
-------------------- ----------- 
MA1111    8 
MA1112    8 
OP1111    12 
OP1112    8 

AvgDiff는 모든 SKU 원래 DaysDifference 동일하다 : 여기서 결과이다.

이제 SKU='MA1111'에 대해 DaysDifference을 변경하고 스크립트를 다시 실행합니다. 결과는 다음과 같습니다.

SKU     AvgDiff 
-------------------- ----------- 
MA1111    4 
MA1112    8 
OP1111    12 
OP1112    8 

이제는 MA1111의 AvgDiff가 4입니다. 이유는 무엇입니까? SKU에 대한 평균은 0이므로 공급 업체별 평균값은 (0 + 8)/2 = 4으로 계산됩니다.

다음 단계는 동일한 공급 업체의 모든 SKU에 대해 DaysDifference를 0으로 설정하는 것입니다. 이 경우 SKU MA1111 및 MA1112에 대해 설정합니다. 이 변경 스크립트의 결과는 다음과 같습니다.

SKU     AvgDiff 
-------------------- ----------- 
MA1111    7 
MA1112    7 
OP1111    12 
OP1112    8 

이제 AvgDiff는 MA1111 및 MA1112 모두에서 7입니다. 어떻게 그렇게 되었습니까? 두 가지 모두 DaysDifference = 0입니다. 즉, 공급 업체별 평균을 가져와야합니다. 그러나이 경우 벤더 평균도 0입니다. 요구 사항에 따르면 여기서 평균은 스크립트가 반환 한 값인 7로 기본 설정해야합니다.

그래서 스크립트가 제대로 작동하는 것 같습니다. 나는 그것이 뭔가를 놓친 것 또는 당신이 몇 가지 세부 사항을 언급하는 것을 잊어 버린 것을 이해합니다. 어쨌든,이 스크립트가 어디에 문제를 해결하지 못하는지 알면 정말 기쁩니다.

+0

일별 차이가 0이고 공급 업체 수준에서 평균을 얻지 못했을 때 고려하지 않았습니다. 나는 이것을 가지고 놀 수 있었지만, 합체는 이전에 그것을 사용하지 않았다. 고맙습니다. – pqsk

+0

@pqsk : INNER JOINed 인 subselect는 공급 업체 레벨에서 평균을 계산하고이 값은 COALESCE에 포함됩니다. COALESCE는 기본적으로 확장 ISNULL입니다. 하나 이상의 인수가 필요할 수 있습니다. 첫 번째가 NULL이 아니면 반환되고, 그렇지 않으면 함수는 두 번째 arg를보고 NULL이 아니면 반환됩니다. 그렇지 않으면 세 번째 인수가 고려됩니다. 0 diff 나는 NULLIF로 수정 될 수 있다고 생각합니다 (ISNULL의 반대 방향 : arg1 = arg2 인 경우 NULL을 반환 함). 한번보세요. –

+0

예 이제 0이 사용되고 있음을 알았지 만, daysdiff에 0이있을 때 공급 업체 수준에서 여전히이를 수행하지 않습니다. 내가 생각해 낸 것은 위대한 작품이지만 너무 오래 걸립니다. 낯선 사람이라 할지라도 SP에 넣으면 멈추고 삽입되지 않습니다. 그러나 내가 그것을 thet 쿼리에서 선택하기 만하면 레코드를 올바르게 표시합니다. 나는 단지 여기저기서 만났다. – pqsk

관련 문제