2015-01-20 3 views
0
하위 쿼리

내가 SQL 쿼리의 실행이 런타임 오류 3075.MS 액세스 VBA 런타임

마이크로 소프트 SQL 서버 관리자에서 동일한 쿼리 실행을 생성 VBA에 문제가 발생하고와 SQL 쿼리에 오류 3075 , 아무런 문제가 발생하지 않고 원하는 결과가 반환됩니다.

Debug.print (여기에 제안 된대로 : https://stackoverflow.com/a/3136299/4474367)와 함께 sql-query를 인쇄하여 쿼리가 어떻게 보이는지 확인했습니다. SQL Server Manager에 붙여 넣기가 정상적으로 작동합니다.

내가하고있는 일은 특정 딜러 (그리고 다른 기준)에 대한 총 행 수 (설문 조사 응답)를 선택하고 결과를 A2 = 5 인 하위 행의 총 행수로 나눈 것입니다) 그리고 나서 100을 곱해서 A2 = 5의 백분율을 얻으십시오.

여러분들은 틀렸다고 생각합니까? Access에서 내가 고려하지 않은 제한 사항이 있습니까? 오류 메시지에는 하위 쿼리 만 표시됩니다.

SELECT DealerCode, 
    (SELECT CAST(COUNT(A2) AS FLOAT) 
    FROM dbo_Service 
    WHERE A2 = 5 
    AND MarketCode = 'CA' 
    AND DealerCode = '3140' 
    AND CompleteDate BETWEEN '2014-01-20' 
    AND '2015-01-20')/COUNT(*) * 100 AS TopBox 
FROM dbo_Service 
WHERE DealerCode = '3140' 
AND MarketCode = 'CA' 
AND CompleteDate BETWEEN '2014-01-20' AND '2015-01-20' 
GROUP BY DealerCode; 

포경 버전 (상기와 동일,하지만 줄 바꿈없이) : 여기

내 쿼리입니다 (I 라인으로 조금을 잘라 읽기 쉽도록 나누기)

SELECT DealerCode, (SELECT CAST(COUNT(A2) AS FLOAT) FROM dbo_Service WHERE A2 = 5 AND MarketCode = 'CA' AND DealerCode = '3140' AND CompleteDate BETWEEN '2014-01-20' AND '2015-01-20')/COUNT(*) * 100 AS TopBox FROM dbo_Service WHERE DealerCode = '3140' AND MarketCode = 'CA' AND CompleteDate BETWEEN '2014-01-20' AND '2015-01-20' GROUP BY DealerCode; 

VBA 코드 조각, 질의 절차 : 여기

strSQL = "SELECT DealerCode, (SELECT CAST(COUNT(A2) AS FLOAT) FROM dbo_Service WHERE A2 = 5 AND MarketCode = 'CA' AND DealerCode = '3140' AND CompleteDate BETWEEN '2014-01-20' AND '2015-01-20')/COUNT(*) * 100 AS TopBox FROM dbo_Service WHERE DealerCode = '3140' AND MarketCode = 'CA' AND CompleteDate BETWEEN '2014-01-20' AND '2015-01-20' GROUP BY DealerCode;" 
Debug.Print strSQL 
Set rs = db.OpenRecordset(strSQL) 
topBox = rs!topBox 
db.Close 

내가받을 오류의 이미지에 대한 링크 (이다 http://i.imgur.com/edGobkG.png

로 인해 이미지 게시가 허용되지 않았습니다. 감사합니다.

+0

스택 오버플로에 오신 것을 환영합니다. 'CAST '는 Access SQL에서 지원되는 함수가 아닙니다. – HansUp

+0

감사! 그게 훨씬 더 일찍 생각해야만했던 것 같아요, 덧붙일 면도날이 있다면, 지금 당장 그것을 사용할 것입니다! 빠른 응답을 보내 주셔서 다시 한번 감사드립니다. – RGiesler

답변

3

MS Access가 아닌 SQL Server 언어 쿼리입니다. 통과 쿼리 인 SQL Server에 대한 쿼리를 수행해야합니다. 자세한 내용과 해결책을 보려면 SQL Server Passthrough query stored into an Access VBA recordset을 참조하십시오.

+0

답변 해 주셔서 감사합니다. 여기에서 두 가지 솔루션을 모두 테스트 한 후 VBA에서 SQL 쿼리를 편집하고 매력적이었습니다. 당신이 제출 한 링크는 다른 측면에서 저를 도왔습니다, 감사합니다! – RGiesler

2

그래서 HansUp의 대답에 이어 SQL 쿼리를 편집하고 CAST를 Cdbl로 바 꾸었습니다.

는 이제 다음과 같습니다 CDbl에는 대신 나는 또한 CAST 후 "FLOAT 그대로"제거했다 CAST로 변경하는 경우

"SELECT DealerCode, ((SELECT CDbl(COUNT(A2)) FROM dbo_Service WHERE A2 = 5 AND MarketCode = 'CA' AND DealerCode = '3140' AND CompleteDate BETWEEN '2014-01-20' AND '2015-01-20')/COUNT(*)) * 100 AS TopBox FROM dbo_Service WHERE DealerCode = '3140' AND MarketCode = 'CA' AND CompleteDate BETWEEN '2014-01-20' AND '2015-01-20' GROUP BY DealerCode;" 

.

그래서 짧은에, 그것은 다음과 같습니다 대신이의

SELECT CDbl(COUNT(A2)) 

:

SELECT CAST(COUNT(A2) AS FLOAT) 

작업을 수행하는 빠른 수정!

답변 해 주셔서 감사합니다.