如何获取SELECT子句中使用的列的名称

时间:2014-09-10 18:59:17

标签: sql ms-access select

我在Access数据库中有一个表,其中包含一年中12个月中每一个的列。列的名称为“1”到“12”。也就是说,列的名称只是它所代表的月份的数量。这些列包含数字作为数据,我需要对该年剩余月份的列进行求和。例如,现在我们在9月,所以我需要SELECT子句来对列(月)9到12中的值求和。这必须能够动态地总结相关月份,以便下个月(10月)将被排除在外,只有10到12的总和。

如何引用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)

这将是一种方法,但顺便说一句,如果有更好的方法,请告诉我。

我在SO上看过其他关于返回表的所有列名的帖子。这不是我在这里需要的。我需要返回列名并在SELECT子句中对其执行测试。感谢。

EDIT 据我所知,这个结构(包含12个不同列的数据)并不是最好的。这不是我正在设置的新数据库。这是我继承的旧数据库,因此无法对结构进行更改。

2 个答案:

答案 0 :(得分: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

它是否表现良好我不能说 - 这取决于你的数据,但是检索表中联合的所有数据可能是一项代价高昂的操作。无论如何,请试试看它是否有效。

答案 1 :(得分:0)

我不知道这是否适用于Access;但在MS SQL中,您可以编写一个字符串并执行它。 例如

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

Exec(@sqlStr)

字符串很容易操作以包含相关信息..

但另一个问题 - 为什么你会在每列而不是不同的行中拥有所有数据?这样你就可以很容易地获得你想要的数据并以你想要的方式显示它......

<强>更新

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)