我指的是 MS Access SQL。假設我有一個列,其中包含人口的出生日期以及這些日期所屬的幾十年。
Year Decade
1971 8
1953 6
1958 6
1929 3
1930 4
我想創建一個查詢,顯示一個世紀的每個十年有多少人出生。
我知道它會是這樣的
SELECT (Year mod 100) \ 10 1 as [Decade], Count(*) as [How many people]
FROM People
GROUP BY (Year mod 100) \ 10 1
我的問題是,可能有幾十年沒有人從我的人口中出生,我仍然希望這些出現在我的查詢中,為零。
我理想的解決方案是動態定義一個表,由行 {1,2,3,4…} 組成,就像你在任何編程語言中所做的那樣,比如在 Python 中decades = range(1,10),然后用計數的人創建表, 然后用 . 將這兩個連接在一起left join。
這似乎不可能,但我是 SQL 和資料庫的新手。那可能嗎?還有哪些其他方法?
uj5u.com熱心網友回復:
MsAccess 沒有您可以使用的 Range() 之類的函式。我在我的資料庫中所做的是創建一個數字表以用于此類情況。
創建此表的最簡單方法是使用 Excel 電子表格構建數字列(例如,從 1 到 1,000),然后將該電子表格作為新表匯入。然后進行任何適當的調整——例如,新表應該在數字列上有一個主鍵,數字列應該是長整數資料型別。您可以呼叫表 [Numbers] 并將列命名為 [NumberValue] - 這些名稱都在上(您可以很容易地呼叫您的列 [Nums] 甚至只是 [N])。但我會警告不要將名稱 [Number] 用于表或列,因為 Number 是一種資料型別名稱,MSAccess 并不總是與 SQL 或 VBA 關鍵字名稱很好地配合使用。
現在您可以將新表與常規 sql 一起使用:Select * from [Numbers] where NumberValue >= 1 and NumberValue <= 10
uj5u.com熱心網友回復:
首先,創建一個小查詢來生成數字:
Select Distinct Abs([id] Mod 10) As N
From MSysObjects;
將其保存為十。
然后創建一個笛卡爾(乘法)查詢,如下所示:
Select
Ten.N As Decade,
Val(Nz(T.C)) As [How many people]
From
Ten
Left Join
(Select Count(*) As C, [Year] Mod 10 As D
From People
Group By [Year] Mod 10) As T
On Ten.N = T.D
輸出將類似于:

回傳今年日期的擴展示例:
SELECT
DateSerial(Year(Date()),1,1 [Ten_0].[N] [Ten_1].[N]*10 [Ten_2].[N]*100) AS [Date]
FROM
Ten AS Ten_0,
Ten AS Ten_1,
Ten AS Ten_2
WHERE
(((DateSerial(Year(Date()),1,1 [Ten_0].[N] [Ten_1].[N]*10 [Ten_2].[N]*100))<=DateSerial(Year(Date()),12,31))
AND
((Ten_2.N)<4))
ORDER BY
DateSerial(Year(Date()),1,1 [Ten_0].[N] [Ten_1].[N]*10 [Ten_2].[N]*100);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/478479.html
