2012-02-28 2 views
0

안녕을 포함하는이 나는 과정과 같이 있습니다TSQL 집계 함수 식에 집계 오류

CREATE PROCEDURE dbo.DWS_PROG (
           @fromDate datetime = '2012-01-01', 
           @maxMoney money = 200, 
           @limit int = 200 
          ) 
AS 
SET NOCOUNT ON; 

SELECT TOP (@limit) 
    convert(int,P.P_ID) AS 'ID' 
    , max(convert(MONEY,isnull(P.NGp,P.NGz))) AS 'NG' 
    , max(convert(MONEY,(CASE WHEN D.Doc_Type = 0x0000000000000016 
           THEN Cash_PLN 
           ELSE 0 END))) AS 'Interests' 
    , (SELECT TOP 1 convert(VARCHAR, H.Data_zmiany,105) 
     FROM dbo.Pozew_Historia_Stanow H 
     WHERE H.P_ID = P.P_ID 
      AND H.Stan_nastepny_id = 0x000000000000000D /*PZ*/) AS 'Data Pozwu' 
    , max((CASE WHEN Sad_Id=0x0000000000000E08 
       THEN 'EL' 
       ELSE 'PA' END)) AS 'TYPE' 
    , max((CASE WHEN Cost_Name =0x0000000000000008 
       THEN convert(varchar, Pay_Date,105) 
       ELSE NULL END)) AS 'Data pierwszego kosztu wpisu sądowego' 
    , (SELECT TOP 1 convert(VARCHAR, H.Data_zmiany,105) 
     FROM dbo.Pozew_Historia_Stanow H 
     WHERE H.P_ID = P.P_ID 
      AND H.Stan_nastepny_id = 0x00000000000000DD /*EGZ-1*/) AS 'Data wszczęcia egzekucji' 
    , sum((CASE WHEN D.Doc_Type = 0x0000000000000003 
       AND D.Pay_Date >= @fromDate 
       AND D.Pay_Date < DATEADD(mm,DATEDIFF(mm,0,@fromDate) + 1,0) 
       THEN Cash_PLN 
       ELSE 0 END)) AS 'M0' 
FROM dbo.Pozew P 
JOIN dbo.Orders Z 
    ON Z.Orders_Id = P.Orders_Id 
JOIN dbo.Docs D 
    ON D.P_ID = P.P_ID 
WHERE ((P.NGp IS NOT NULL AND P.NGp < @maxMoney) OR (P.NGp IS NULL AND P.NGz < @maxMoney)) 
    AND P.Stan IN ('PZ-PORAŻKA','PZ-PORAŻ-UB','PZ-PSPPOR-SP','PZ-PSPPOR-UP','PZ-PSSSUK-UP','PZ-ZAPŁATA','EGZ-C-ROSZ-1','EGZ-C-ROSZ-2','EGZ-SUKCES-S','EGZ-ZAS-R','EGZ-NZAS-R','EGZ-BS-1C','EGZ-WSZP-1','EGZ-WSZP-2','EGZ-SPL') 
    AND (SELECT TOP 1 dbo.Docs.Pay_Date 
     FROM dbo.Docs 
     WHERE dbo.Docs.P_ID = P.P_ID 
      AND dbo.Docs.Cost_Name = 0x0000000000000008 
    ORDER BY dbo.Docs.Pay_Date) >= @fromDate 
GROUP BY P.P_ID 

이 basicly가 잘 작동하지만 나는 하나의 오류가 있습니다. JOIN의 마지막 줄에 형식 0x00 ... 03을 가진 모든 Documents에 대한 현금을 합산하고 Pay_date는 param의 @param과 end of month 사이에 있습니다. 간단하고

: 작동하지만 하위 쿼리와 @fromDate를 교체해야합니다

SELECT TOP 1 dbo.Docs.Pay_Date 
    FROM dbo.Docs 
WHERE dbo.Docs.P_ID = P.P_ID 
    AND dbo.Docs.Cost_Name = 0x0000000000000008 
    AND dbo.Docs.Pay_Date >= @fromDate 
ORDER BY dbo.Docs.Pay_Date 

은 그래서 모든 문서의 쿼리에 대한 지불의 특정 유형과의 첫 데이트를 취할 것입니다 후부터 시작하는 모든 지불을 요약한다 이 날짜는 월말로 끝납니다.

SUM((CASE WHEN D.Doc_Type = 0x0000000000000003 
      AND D.Pay_Date >= 
       (SELECT TOP 1 dbo.Docs.Pay_Date 
        FROM dbo.Docs 
       WHERE dbo.Docs.P_ID = P.P_ID 
        AND dbo.Docs.Cost_Name = 0x0000000000000008 
        AND dbo.Docs.Pay_Date >= @fromDate 
       ORDER BY dbo.Docs.Pay_Date) 

      AND D.Pay_Date < DATEADD(mm, DATEDIFF(mm, 0, 
       (SELECT TOP 1 dbo.Docs.Pay_Date 
       FROM dbo.Docs 
       WHERE dbo.Docs.P_ID = P.P_ID 
        AND dbo.Docs.Cost_Name = 0x0000000000000008 
        AND dbo.Docs.Pay_Date >= @fromDate 
       ORDER BY dbo.Docs.Pay_Date)) + 1,0) 
     THEN Cash_PLN 
     ELSE 0 END)) AS 'M0' 

을하지만 Management Studio에서 오류가 발생하는 것이 일 후 :

SUM은 다음과 같아야합니다 나는 거의 2 일 동안 그것을 해결하기 위해 노력하고있어

Cannot perform an aggregate function on an expression containing an aggregate or a subquery.

합니다. 아이디어가 있으십니까?

죄송 테이블의 구조를 나타낸하지만 데이터베이스가 너무 커서 내가 아니라 오류 :

내 테이블이 너무과 같이 해결하는 방법이 필요하지 않는 : 등 ID, 이름,

: 표 Pozew을

표 문서 :

문서 : DOCID, p_id (Pozew 테이블에서 키), DOC_TYPE, cost_name, pay_date, cash_PLN

그리고 샘플 기록은 지금처럼

1,1'15,8 '2011-02-04', 400
1,1,3,5 '2011-02-09', 0
1,1,3,5 '

간단한 시나리오 0 -02-12 ', 0
1,1, 3,5,'2011-02-04 ': 우리는 우리가 cost_name와 번째 문서가 말하는 테이블을 문서 도구에 레코드를 추가 = 0x8이면 다른 문서가 추가되지만 Doc_Type = 0x3으로 추가됩니다.

doc_Type = 0x3이고 cost_name = 0x8 인 첫 번째 문서 작성일과 월말 사이에 추가 된 모든 문서를 가져 오려고합니다. 하지만 Pozew_id마다 그룹화해야합니다. 내 부어 영어에 대한 죄송합니다

:

DECLARE @fromDate varchar 
SET @fromDate = '2011-06-01' 
SELECT TOP 100 
sum((CASE WHEN D.Typ_dokumentu = 0x0000000000000003 
      AND D.Data_platnosci >= 
      (SELECT TOP 1 Data_platnosci 
      FROM Dokumenty 
      WHERE Pozew_Id = P.Pozew_Id 
      AND Nazwa_kosztu = 0x0000000000000008 
      AND Data_platnosci >= @fromDate 
      GROUP BY Pozew_Id) 
      AND Data_platnosci < DATEADD(mm,DATEDIFF(mm,0, 
      (SELECT TOP 1 Data_platnosci 
      FROM Dokumenty 
      WHERE Pozew_Id = P.Pozew_Id 
      AND Nazwa_kosztu = 0x0000000000000008 
      AND Data_platnosci >= @fromDate 
      GROUP BY Pozew_Id) 
      ) + 1,0) THEN Kwota_PLN ELSE 0 END)) AS 'M0' 
FROM 
Dokumenty D 
JOIN Pozew P 
    ON D.Pozew_Id = P.Pozew_Id 
WHERE 
((P.NGp IS NOT NULL 
AND 
P.NGp < 200) 
OR 
(P.NGp IS NULL 
AND 
P.NGz < 200)) 
AND 
P.Stan IN ('PZ-PORAŻKA','PZ-PORAŻ-UB','PZ-PSPPOR-SP') 
AND 
(SELECT TOP 1 
    dbo.Dokumenty.Data_platnosci 
FROM 
    dbo.Dokumenty 
WHERE 
    dbo.Dokumenty.Pozew_Id = P.Pozew_Id 
    AND 
    dbo.Dokumenty.Nazwa_kosztu = 0x0000000000000008 
ORDER BY 
    dbo.Dokumenty.Data_platnosci) >= @fromDate 
+0

죄송합니다 @Filip 드 ​​보스를 보여줍니다 :

는 그런 다음 합계입니다/ – Misiu

+0

걱정할 필요가 없습니다. vg에서 gg = G에. –

답변

0

그것에서 파생 테이블을 가지고하는 것이 가능하지 않을까요 당신은 "첫 번째 지불의 유형 당 @fromDate 후"다음에 선택을 제공하기 위해 가입 그와 비교할 진술. 당신은 따라서 적절한 시작 날짜를 받고 지불의 유형으로 파생 테이블에 가입

select p_id, min(pay_date) startDate 
from docs 
where cost_name = 0x0000000000000008 
    and pay_date >= @fromDate 
group by p_id 
order by pay_date 

같은

즉 파생 쿼리 뭔가.

sum((case when d.doc_type = 0x0000000000000003 
      and d.pay_date >= startDate 
      and month(d.pay_date) = month(startDate) 
      and year(d.pay_date) = year(startDate)) then cash_pln 
      else 0 end) as 'M0' 

주 내가 완전히 정확하지 않을 수 있으므로이 시도하지 않은 그러나 희망이 서식 ​​혼란에 대한 원칙

+0

나는 당신의 쿼리에서 레코드를 포함하고있는 테이블로 다른 조인을했다. 그것은 매력처럼 작동합니다. – Misiu

+0

가짜 SQL은 앞으로 나아갈 길입니다! 감사 – kaj

0

내가 변수로 pay_date을 넣어 그와 함께 일하는 것이 : 나는 더 명확하게 내 문제를 보여줍니다 간단한 쿼리를 생성 한/

. 그것은 결국 상수 값입니다.쿼리에서 다음

DECLARE @pay_date datetime 
SET @pay_date = (SELECT TOP 1 dbo.Docs.Pay_Date 
        FROM dbo.Docs 
        WHERE dbo.Docs.P_ID = P.P_ID 
        AND dbo.Docs.Cost_Name = 0x0000000000000008 
        AND dbo.Docs.Pay_Date >= @fromDate 
        ORDER BY dbo.Docs.Pay_Date) 

AND D.Pay_Date >= @pay_date 
+0

답장을 보내 주셔서 감사합니다.하지만, 변수를 선언하고 위와 같이 사용하면 @pay_date보다 큰 pay_date로 모든 기록을 보유하게됩니다. 내가해야 할 일은 모든 문서에 대해 pay_date를 선택하는 것입니다. 나는 어떤 종류의 논리를 달성하고 싶은지 보여주기 위해 내 게시물을 편집 할 것이다. – Misiu