我在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个不同列的数据)并不是最好的。这不是我正在设置的新数据库。这是我继承的旧数据库,因此无法对结构进行更改。
答案 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)