2013-04-30 4 views
1

Access 2010 here.MS-Access 날짜 범위의 모든 요일을 포함 쿼리

다른 퍼즐로 돌아 가기. 나는이 쿼리를 가지고있다 :

SELECT DischargeDatabase.Date, Avg([pH]) AS [pH Value], Avg([Temperature]) AS [Temperature (°C)], Avg([ZincLevel]) AS [Zinc (mg/l)], Sum([Effluent]) AS [Discharge (gal)], Count(*) AS [# Discharges] 
FROM DischargeDatabase 
WHERE DischargeDatabase.Date Between Forms!QueryForm!TextCriteriaQ0A And Forms!QueryForm!TextCriteriaQ0B 
GROUP BY DischargeDatabase.Date; 

내가 개발해온 폐수 처리 데이터베이스. 이것은 하루 평균 폐수 배출량을 제공하고 평균 pH, 온도 및 아연 수준을 계산하고 배출량 (유출수)을 합산합니다. 사용자는 날짜 선택 도구가있는 "QueryForm"의 두 텍스트 상자에서 범위를 선택하고 쿼리를 실행합니다.

표시되는 것은 방전을 날짜 범위별로 분류하고 방전이 나열된 날뿐입니다. 사용자가 요청한 범위는 매일 표시되며, "DischargeDatabase"에 기록이없는 요일에는 필드 값이 0으로 표시됩니다. 이것에

Date  | ph Value | Temperature (°C) | Zinc (mg/l) | Discharge (gal) | # Discharges 
4/11/2013 9.5  18.6    0.89   5000    5 
4/12/2013 9.1  17.9    1.68   3000    2 
4/15/2013 8.9  19.6    1.47   10000    7 
4/16/2013 9.6  18.2    0.35   1500    1 

:이 (주말 동안 날짜 범위 2013년 4월 11일에 2013년 4월 16일)에서

Date  | ph Value | Temperature (°C) | Zinc (mg/l) | Discharge (gal) | # Discharges 
4/11/2013 9.5  18.6    0.89   5000    5 
4/12/2013 9.1  17.9    1.68   3000    2 
4/13/2013 0.0   0.0    0.0   0     0 
4/14/2013 0.0   0.0    0.0   0     0 
4/15/2013 8.9  19.6    1.47   10000    7 
4/16/2013 9.6  18.2    0.35   1500    1 

이 모든되도록 사용자는 문제없이 Excel 스프레드 시트에 쿼리를 붙여 넣을 수 있습니다. 나는 이것이 가능하거나 쿼리의 범위 내에서 (심지어 존재하지 않는 레코드를 "선택"하고 있는지)조차 확신하지 못한다. 작동 할 수있는 것은 가짜 테이블/쿼리가 사전에 0으로 채워진 일종의 조인입니까?

도움 및 아이디어를 제공해 주셔서 감사합니다.

답변

1

캘린더 테이블을 사용하면 상당히 쉬울 수 있습니다. custom CreateTable_calendar and LoadCalendar procedures을 사용하여 직접 빌드 할 수 있습니다.

날짜 범위를 기준으로 캘린더 테이블을 필터링하고 다른 테이블에 LEFT JOIN을 필터링하는 쿼리를 만듭니다. (이 예에서는 SELECT 필드 목록을 단순화했습니다.)

SELECT 
    c.the_date, 
    Count(ddb.Date) AS [# Discharges] 
FROM 
    tblCalendar AS c 
    LEFT JOIN DischargeDatabase AS ddb 
    ON c.the_date = ddb.Date 
WHERE 
    c.the_date Between 
      Forms!QueryForm!TextCriteriaQ0A 
     And Forms!QueryForm!TextCriteriaQ0B 
GROUP BY c.the_date; 
+0

나는이 솔루션을 좋아합니다. LoadCalendar에 매개 변수를 전달하거나 매개 변수를 전달하지 않고 "Null의 잘못된 사용 94"오류가 있습니다. intYear를 정적 "2013"로 설정하고 LoadCalendar 하위를 실행하면 하위가 "작동"됩니다. 그것이 내 시스템인지 또는 무엇인지는 확실치 않지만, Year (날짜)가 나를 위해 작동하지 않습니다. 지금 문제를 조사 중입니다. 고맙습니다. – Phizon

+0

Doh, Year (Now())가 작동하는 것으로 보이며 1 년 동안 변경 될 것입니다. 다시 감사합니다! – Phizon

+0

'LoadCalendar'에서 문제를 찾을 수 없습니다. 저는 왜 'Year (Date)'에 문제가 있었는지 의아해합니다. 그것은 2013로 정수를 제공합니다. – HansUp

1

당신은 당신의 마지막 진술과 함께 올바른 길을 걷고 있습니다! 데이터가없는 경우에도 모든 그룹을 채우는 이런 종류의 작업은 원하는대로 테이블이나 집계 테이블 (CTE 또는 실제 테이블이 될 수 있음)을 사용하여 수행 할 수 있습니다. 당신은 당신이 CTE하는의 왼쪽 테이블로 사용할 수 있습니다, 지금은 ...

;WITH CTE AS (
    SELECT 1 as Num 
    UNION ALL 
    SELECT Num + 1 FROM CTE WHERE Num < @Max 
) 

SELECT * FROM CTE 

가이 패턴은 날짜를 생성하기 위해 확장 할 수 있습니다 ... 날짜를 생성하는

declare @startDate datetime 
set @startDate = getdate() --to start from today 

;WITH CTE AS (
    SELECT @startDate as myDate 
    UNION ALL 
    SELECT dateadd(day, 1, myDate) as myDate FROM CTE WHERE myDate < dateadd(day, 30, @startDate) 
) 

SELECT myDate FROM CTE 

을 CTE를 확장 할 수 있습니다 오른쪽 외부 조인. Access에서는이 것이 실제 테이블 일 필요가 있다고 생각합니다. 하나 만들고 수동으로 숫자로 채 웁니다. 한 번만 수행하면됩니다.