2013-12-22 5 views
-3

MS 액세스에 여러 필드가있는 테이블이 있습니다. 이 필드에는 2011_2, 2011_3, ..., 2013_9, 2013_10, ..., 2015_1, 2015_2 ...와 같은 기간을 나타내는 필드 이름이 있습니다.쿼리에서 날짜를 기준으로 필드 이름을 동적으로 선택

다음 12 개월을 선택하는 쿼리는 어떻게 실행합니까? 오늘 날짜를 기반으로 필요한 필드로? 2013 년 12 월 22 일이면 2013_12, 2014_1, 2014_2, ..., 2014_12?

감사합니다.

+0

아마도 시도 할 수 있습니까? –

+0

2013_9를 시뮬레이트하려고 시도하기 위해 SELECT (Year (Now)) & "_ 9"를 사용하려고했지만 반환 된 결과는 다음과 같습니다. 필드 이름은 expr1000이고 해당 필드의 값은 2013_9의 열입니다. 해당 열의 모든 셀 – user3126475

+2

데이터가 SQL 쿼리를 처리하기위한 잘못된 구조에 있습니다. 그것을 정규화해야합니다. – Yawar

답변

1

질문에 대한 간단한 대답은 액세스 쿼리 빌더에서 동적 필드 이름을 가질 수 없다는 것입니다. 이상적으로는 날짜 필드가 하나가되도록 데이터를 수정해야합니다. 그렇게하면 아래 체조가 필요없는 쿼리 기준에서 해당 필드의 기간을 지정할 수 있습니다.

그렇다면 긴 대답은 VBA 코드를 사용하여 쿼리를 작성해야한다는 것입니다. 아래 코드는 필요한 필드를 포함 할 데이터베이스 (새롭게 "YourQuery"라고 함)에 새 쿼리를 작성해야합니다.

테이블이 무엇인지 불분명하기 때문에이 예제에서는 "테이블"이됩니다. 이 코드를 사용하면 테이블이 무엇이든 변경해야합니다.

데이터베이스의 VBA 모듈에이 코드를 설치 한 다음이 함수를 호출하여 새 쿼리를 생성해야합니다. 예를 들어, 실행할 프로 시저로 "DynamicQuery()"를 사용하는 "RunCode"조치를 사용하여 매크로를 작성할 수 있습니다. 이 달에 대한 쿼리가 이미 존재하면 함수 호출이 실패하므로 어떤 이유로 든 다시 실행해야 할 경우 수동으로 삭제하십시오 (이 작업을 수행하는 데 추가 코드를 추가 할 수도 있음).

다시 말해서 뭔가를 할 수 있다고해서 꼭해야한다는 것은 아닙니다. 이와 같은 대안에 의지 할 필요가 없도록 테이블을 재 설계해야합니다.

Public Function DynamicQuery() 

Dim strSQL As String 
dim datFieldDate As Date 
Dim strYearMonth As String 
Dim strThisMonth As String 
Dim dbs As DAO.Database 
Dim qdf As DAO.QueryDef 
Dim i As Integer 

Set dbs = CurrentDb 

strThisMonth = Year(Date) & "_" & Month(Date) 

strSQL = "SELECT table." & strThisMonth 

For i = 1 to 12 

datFieldDate = DateAdd("m",i,Date) 
strYearMonth = Year(datFieldDate) & "_" & Month(DatFieldDate) 

strSQL = strSQL & ", table." & strYearMonth 

Next i 

strSQL = strSQL & " FROM table;" 

Set qdf = dbs.CreateQueryDef("YourQuery_" & strThisMonth, strSQL) 

Set qdf = Nothing 
Set dbs = Nothing 

End Function 
+0

고마워요! 사소한 수정 작업으로 인해 2013_9에 밑줄 표시가 있기 때문에 [] 할 필요가 있음이 밝혀졌습니다. 그러나 큰 도움! 감사! – user3126475

1

당신은 당신이 문자열로 코드에서 SQL 문을 만들 수 있습니다 그것에 버튼 Access에서 폼, 예를 들면있는 경우 :

MyString = "SELECT " & Year(Now) & "_9" & " FROM myTable....." 

당신은 다음 코드를 통해 그것을 실행할 수 있습니다.

선택할 필드 목록을 동적으로 만드는 "표준"쿼리를 만들 수 없습니다.

관련 문제