2014-09-10 52 views
0

我有一個表中有列每一年12個月的的Access數據庫。這些列的名稱爲「1」到「12」。也就是說,列的名稱只是它所代表的月份的編號。這些列包含數字作爲數據,並且我需要總結當年剩餘月份的列。例如,現在我們在9月份,所以我需要SELECT條款將列(月)9到12中的值相加。這必須能夠動態地總結相關月份,以便下個月(Oct )Sep將被排除,並且只有10到12被加和。如何獲得使用列名在SELECT子句

我如何引用SELECT子句中的列名,以便能夠在其上進行測試。我需要的東西像下面這樣:

IIf(Table1.[1].ColumnName >= Month(Now), Table1.[1], 0) 
+ IIf(Table1.[2].ColumnName >= Month(Now), Table1.[2], 0) 
... 
+ IIf(Table1.[12].ColumnName >= Month(Now), Table1.[12], 0) 

這將是一個辦法,但在傳球,如果有更好的方式來做到這一點,請讓我知道爲好。

我見過上的其他職位,商量返回所有列名的表。這不是我需要的。我需要返回列名並在SELECT子句中對其執行測試。謝謝。

EDIT 我明白,這種結構(具有12個不同的列中的數據)不是最大的。這不是我設置的新數據庫。這是我繼承的舊數據庫,所以我無法對結構進行更改。

回答

2

不知道我理解你的問題,但它似乎主要問題是你,而不是存儲在不同的列的類似值的事實。

一種解決方案可以是使用union在子查詢中,使列提供給外部選擇和使用通過過濾,和與基。

如果你有一個表,看起來像:

id (number, primary key), 1..12 (number, month values) 

於是這樣的查詢應該工作(這是本月1-5只):

SELECT id, SUM(MonthValue) AS SumFutureMonths 
FROM (
    SELECT 1 AS MonthNo, id, YourTable.[1] AS MonthValue FROM YourTable 
    union all 
    SELECT 2 AS MonthNo, id, YourTable.[2] AS MonthValue FROM YourTable 
    union all 
    SELECT 3 AS MonthNo, id, YourTable.[3] AS MonthValue FROM YourTable 
    union all 
    SELECT 4 AS MonthNo, id, YourTable.[4] AS MonthValue FROM YourTable 
    union all 
    SELECT 5 AS MonthNo, id, YourTable.[5] AS MonthValue FROM YourTable 
) 
WHERE MonthNo > MONTH(NOW()) 
GROUP BY id 

無論是將執行好我不能說 - 它取決於你的數據,但檢索表中所有數據的聯合可能是一個代價高昂的操作。無論如何,請試試看看它是否有效。

+0

這實質上在結構創造了一個「臨時」表中的數據應該首先創建,以便能夠執行我需要的'SELECT'和'JOIN'。聰明。這不是一個龐大的數據庫,所以性能還是相當不錯的,無論如何,性能對於我所需要的並不那麼重要。謝謝一堆! – neizan 2014-09-11 16:40:51

0

我不知道這是否在Access中工作;但在MS SQL你可以寫一個字符串,並執行它.. 例如

@sqlStr = "Select 9, 10, 11, 12 from table" 

Exec(@sqlStr) 

和一個字符串將是相當容易操縱到包含相關信息..

但另一個問題 - 你爲什麼會讓每個列中的所有數據而不是不同的行?這樣,你才能真正輕鬆地得到你想要的數據,並顯示您希望的方式來..

UPDATE:

DECLARE @i int 
SET @i = MONTH(getdate()) 

DECLARE @str nvarchar(max) 
SET @str = 'SELECT ' 

WHILE @i <= 12 
    BEGIN 
     SET @str = @str + cast(@i as nvarchar(max))+ ',' 
     SET @i = @i + 1 
    END 

SET @str = LEFT(@str, len(@str) - 1) + ' FROM TABLE' 

Exec(@str) 
+0

在MS網站更多信息.. http://msdn.microsoft.com/en-us/library/office/ff198330(v=office.15).aspx – ssn 2014-09-10 20:04:52

+0

即使這部作品在Access中,我還沒有試過但是,這是如何動態的? 9,10,11和12如何動態選擇?它看起來很難編碼給我,但也許我誤解了一些東西。關於數據的結構,我繼承了這個數據庫。我知道它的結構可能會更好,但我無法對其做出重大改變。 – neizan 2014-09-11 11:30:58

+0

我寫的是靜態的,但一個字符串可以很容易地操作:-)看到我更新的答案。 – ssn 2014-09-11 11:50:41

相關問題