2010-09-30 96 views
2

我在SQL Server中有一個查詢,我試圖將其轉換爲MS-Access 2003中的查詢。該查詢旨在用作報表的基礎。該報告有兩個字段:'已分配案例'和'已關閉案例'。將SQL查詢轉換爲Access查詢 - SELECT內的SELECT

SELECT 
(SELECT COUNT(*) 
FROM CaseDetail 
WHERE CaseAssignedDate Between '1/1/2008' AND '1/1/2009') as 'Cases Assigned', 
(SELECT COUNT(*) 
FROM CaseDetail 
WHERE CaseClosedDate BETWEEN '1/1/2008' AND '1/1/2009') as 'Cases Closed' 

我使用的是SQL Access 2003中有困難,我已經取代了'字符#用於訪問的緣故,但仍然沒有喜悅。 Access在SELECT語句中有SELECT問題嗎?我從Access獲得的錯誤不太有用。

Reserved error (-3205); there is no message for this error 

另外,如果SQL語句是如此需要從多個表中獲取數據,那該怎麼辦?例如...

SELECT 
(SELECT COUNT(*) 
FROM AssignedCases 
WHERE CaseAssignedDate Between '1/1/2008' AND '1/1/2009') as 'Cases Assigned', 
(SELECT COUNT(*) 
FROM ClosedCases 
WHERE CaseClosedDate BETWEEN '1/1/2008' AND '1/1/2009') as 'Cases Closed' 

這適用於沒有問題的SQL,但不適用於Access。

回答

0

允許在Access和SQL服務器中嵌套查詢,但至少在SQL服務器中它要求您爲嵌套查詢設置一個假別名,並且嵌套查詢中的所有列都需要一個名稱。這可能導致了錯誤。

我建議以下查詢:

SELECT q1.CasesAssigned, q2.CasesClosed 
FROM 
(SELECT COUNT(*) AS CasesAssigned 
FROM CaseDetail 
WHERE CaseAssignedDate Between '1/1/2008' AND '1/1/2009') as q1, 
(SELECT COUNT(*) AS CasesClosed 
FROM CaseDetail 
WHERE CaseClosedDate BETWEEN '1/1/2008' AND '1/1/2009') as q2 
+0

我在Access中運行它,它工作!這對我來說很理想,因爲我需要彙總來自獨立和不相關表中的字段的數據。這允許將所有聚合數據作爲單行結果集收集,這使我可以將其用作報告的基礎。謝謝@littlegreen! – webworm 2010-09-30 21:19:19

+0

「SQL服務器它需要你爲你的嵌套查詢設置一個假別名,並且你的嵌套查詢中的所有列都需要一個名字」 - 我認爲你誤讀了查詢:這些是SELECT語句中的標量子查詢,不需要列「別名」和表相關名稱。你似乎在談論'FROM'子句中的派生表。 – onedaywhen 2010-10-01 09:46:03

+0

在這種情況下,可以省略'as q1'和'as q2'。我目前無法測試,但你可能是對的。 – thomaspaulb 2010-10-02 20:12:52

0

3205錯誤是交叉表列標題太多。

這是否查詢爲您解決:

SELECT 'Cases Asssigned' as Type, COUNT(*) 
FROM CaseDetail 
WHERE CaseAssignedDate Between '1/1/2008' AND '1/1/2009' 
UNION 
SELECT 'Cases Closed'as Type, COUNT(*) 
FROM CaseDetail 
WHERE CaseClosedDate BETWEEN '1/1/2008' AND '1/1/2009') 

結果將在兩行而不是一個。

+0

由於這將是報告的基礎,有沒有辦法將結果作爲1行與多列返回? – webworm 2010-09-30 16:01:20

1

我目前還沒有Windows機器測試,但類似這樣的應該工作。

SELECT SUM(IIF(CaseAssignedDate 
      BETWEEN #1/1/2008# AND #1/1/2009#, 1, 0)) AS CasesAssigned, 
     SUM(IIF(CaseClosedDate 
      BETWEEN #1/1/2008# AND #1/1/2009#, 1, 0)) AS CasesClosed 
    FROM CaseDetail 

在我的經驗,一般最好在可能情況下,避免在Access中使用子查詢。


編輯:
迴應您的意見,我只測試了Access允許這種替代方法:

SELECT * 
    FROM 
(
SELECT 'CasesAssigned', COUNT(*) AS Total 
    FROM AssignedCases 
WHERE CaseAssignedDate BETWEEN #1/1/2008# AND #1/1/2009# 

UNION ALL 

SELECT 'ClosedCases', COUNT(*) AS Total 
    FROM ClosedCases 
WHERE CaseClosedDate BETWEEN #1/1/2008# AND #1/1/2009# 
); 

EDIT2:
littlegreen's answer會工作,如果你需要一個一個排結果集。

+0

如果所有數據都來自一個表,那麼這起作用。如果需要查詢其他表格,該如何修改? – webworm 2010-09-30 19:20:21

+1

@webworm:請參閱我的編輯。我不太確定分割這些數據是否是最好的表格結構。但是,這完全是另一個問題。祝你好運。 – bernie 2010-09-30 20:01:51

+1

@webworm:那麼littlegreen的答案是理想的。 – bernie 2010-09-30 20:51:49

1

我不知道你在哪裏得到這個錯誤信息,但你的問題是試圖沒有至少一個表或查詢執行Select語句。你需要一些「虛擬」表,只有一個記錄來完成這一點。

SELECT 
    (SELECT COUNT(*) 
    FROM CaseDetail 
    WHERE CaseAssignedDate Between '1/1/2008' AND '1/1/2009' 
    ) as 'Cases Assigned', 
    (SELECT COUNT(*) 
    FROM CaseDetail 
    WHERE CaseClosedDate BETWEEN '1/1/2008' AND '1/1/2009' 
    ) as 'Cases Closed' 
FROM DummyTableWithOneRecord; 
+0

你能解釋爲什麼需要這個「DummyTableWithOneRecord」嗎?看起來像一個黑客。記錄是否必須包含一定數量的字段?具體名稱? – webworm 2010-09-30 18:57:35

+0

我應該解釋我的意思是黑客。不是以壞的方式破解,而是更多的是我真的不明白它是如何工作的。我嘗試了你的建議,但我得到了一個N​​ULL結果集。沒有行,也沒有字段。 – webworm 2010-09-30 20:48:34

+0

+用於實際回答問題,即Select語句需要一個表格。 – onedaywhen 2010-10-01 09:35:54

1

既然你有在SQL Server可以查詢,創建一個使用該查詢(在SQL Server),並返回結果集接入接入傳遞查詢。

或者,根據該SELECT語句創建一個SQL Server視圖並鏈接到來自Access的視圖。

由於它已經在SQL Server中工作,我沒有看到在Access中重新創建查詢的任何附加值。

+0

+1如果你不能擊敗他們,加入他們。 – bernie 2010-09-30 21:36:25

+0

INNER JOIN? :-) – HansUp 2010-09-30 21:39:17

+1

那麼,在Access中它肯定不能是一個OUTER JOIN! – 2010-10-01 03:23:14