2011-08-09 3 views
1

CSV 파일에서 파싱 된 청구 및 크레딧 테이블을 기반으로 요금 및 크레딧 리포트를 만들려고합니다. 이 보고서 I 그룹에게 요금 및 크레딧을 작성하고 내가 가지고있는 아이템 코드에 기반을 요약하면Null 값을 0으로 바꾸기/더미 값을 빈 테이블에 넣기 Access

BillingPeriod | ItemCode | ItemName | Charge(Credit) | IsAdjustment | AdjustmentDate | ReportTimestamp 

아래와 같이 충전 테이블 및 신용 표는 단지 ​​하나의 필드가 다른 존재로, 기본적으로 동일한 보인다. 예를 들어, 나는 그 작업 한 하나 개의 쿼리는 모든 청구 개월 동안 보조 요금이 벌금과 멋쟁이 전부입니다

SELECT Charges.BillingPeriod, Sum(Charges.Charge) as SumOfCharge 
FROM Charges 
WHERE (Charges.ItemCode Between 1301 and 1380) 
GROUP BY Charges.BillingPeriod; 

될 것이라고 요약하지만, 상품 코드가 발견되지 않을 때 문제가 발생합니다. 이 쿼리는 한 달 동안 비용이 청구되지 않을 수도 있고 특정 달의 크레딧이 있거나없는 요약을 표시 할 정도로 충분히 유연 할 수 있습니다. 다른 달 동안 비용이 청구될 수 있습니다. 우리가 그 특정 항목 코드 적립되지 않은 때문에

SELECT Credits.BillingPeriod, Sum(Credits.Credit) AS SumOfCredit 
FROM Credits 
WHERE (((Credits.ItemCode)=2217 Or (Credits.ItemCode)=2218 Or (Credits.ItemCode)=2241 Or (Credits.ItemCode)=2245 Or (Credits.ItemCode)=2260)) 
GROUP BY Credits.BillingPeriod; 

은, 그들이 요약 할 수 없으며, 결과 집합은 빈 테이블 :

작동하지 않는 문제의 쿼리는 다음 중 하나입니다. 이러한 상황이 발생하면 SumOfCredit에 null 청구 기간과 0을 반환 할 수있는 방법이 있습니까? 나는 IIz (IsNull())뿐만 아니라 Nz() 함수를 시도했지만 그 점이 도움이되지 못했습니다.

도움을 주시면 감사하겠습니다.

편집 : 나는 그것은 다음과 같습니다 있도록 쿼리 변경 :

SELECT Charges.BillingPeriod, SUM(Charges.Charge) AS SumOfCharge 
FROM Charges 
WHERE (((Charges.ItemCode) Between 1900 And 1995)) 
GROUP BY Charges.BillingPeriod 
UNION 
SELECT BillingPeriod, 0 
FROM Charges 
WHERE NOT EXISTS (SELECT * FROM Charges WHERE (Charges.ItemCode Between 1900 And 1995)); 

이 작동을하지만, 모든 청구 기간을 표시하지 않습니다. 예를 들어, 2011 년 1 월 1 일과 2011 년 2 월 1 일에 특정 품목 코드에 요금이 부과되면 해당 두 레코드 만 표시됩니다. 테이블에 적용 가능한 모든 청구 기간을 표시하고 싶습니다. 그 달에 요금이 부과되는 곳과없는 곳에서 요금이 부과됩니다. 세 번째 UNION 쿼리 끝에 추가 시도했다 BillingPeriod, 0 다시 선택하지만 한 달 동안 중복 레코드를 추가합니다. 나는 원하지 않습니다. 다시 한 번 도움이 될 것입니다.

+0

'BillingPeriod' 제발. 이 열에 대한 예제 데이터도 유용 할 것입니다. –

답변

1

첫째, 다음 만트라, 하나에 당신의 서투른 OR의를 감소 "적은 코드 것이 좋다"

WHERE Credits.ItemCode in (2217, 2218, 2241, 2245, 2260) 

다음, 모든 존재 ItemCodes의 테이블 조합 :

SELECT Credits.BillingPeriod, Sum(Credits.Credit) AS SumOfCredit 
FROM Credits 
WHERE Credits.ItemCode in (2217, 2218, 2241, 2245, 2260) 
GROUP BY Credits.BillingPeriod 
UNION 
SELECT null, 0 
WHERE NOT EXISTS (SELECT * FROM Credits 
    WHERE Credits.ItemCode in (2217, 2218, 2241, 2245, 2260)); 

Access에서 FROM 절을 허용하지 않는 경우 - DUAL 또는 다른 하나의 행 결과 집합에서 선택하지 않은 경우 (예 : ID = 1 또는 기타 등등의 경우 FROM SYSTABLES WHERE ID = 1 등)

+0

나는 SELECT BillingPeriod, 0 FROM Credits로 쿼리를 변경했으며, 원하는대로 작동했습니다. 고마워요! 나는 너를 업신 여길 꺼야.하지만 나는 명성이 없다. 하하. – Tom

+0

한가지 더, 미안하지만, 예를 들어, 한 청구 기간 동안 유효 레코드가있는 경우, 수정과 함께 작성한 쿼리가있을 때 결과 집합은 해당 청구 기간뿐입니다. 모든 청구 기간이되고 싶습니다. 그 달에 대해 청구되지 않았다면 합계는 0이됩니다.이 쿼리를 수정하여 어떻게 처리 할 수 ​​있는지 생각해보십시오. – Tom

+0

원하는 추가 행마다 별도의 합집합을 추가해야합니다. – Bohemian

관련 문제