1

好的我一直在思考动态列的想法,我的意思是一个名为January......的列表December

用户在运行时会选择一个月份范围,例如Febto July

我通常会从后面的代码中获取所有列,然后对我需要的和不需要的进行排序。

但我想知道一种在 SQL 中完成这一切的方法。

我知道 SQL 不支持数组(悲伤的脸),但还有其他选择。

所以我的问题是,是否有一种方法可以设置 SQL 查询,根据列名范围的参数动态选择多个列?

我看过一些动态查询,但它们只做 1 列。

我正在考虑将后面的代码提供的一串列作为 SQL 中的 1 参数传递,然后以某种方式迭代以选择每一列。

你们有什么感想?不能完成吗?可以做但是很乱?

编辑:以为我会提供一些代码,如您所见,我应用了一个数据透视查询并获得了一系列列(月)。到目前为止的建议是先规范化,然后再调整。

SELECT
   [1] January ,
   [2] February,
   [3] March,
   [4] April,
   [5] May,
   [6] June,
   [7] July,
   [8] August,
   [9] September,
   [10] October,
   [11] November,
   [12] December
   FROM
(
  SELECT MONTH(Convert(datetime,[lasttaken],120)) as months, complete
  FROM #Temp WITH(NOLOCK)
) d
pivot 
(
   count(complete)
   for months in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])
) p 
4

3 回答 3

4

有一种方法可以做到这一点,但涉及重组你的表。
您的问题是 (month) 列名称是元数据,您想查看它们

代替

year | Jan | feb | Mar | Apr | etc  
2013 | 10  | 9   | 11  | 4   | 0

作为实际数据。

您要做的是为月份制作一列,并将您的数据标准化为如下所示。

year | month | data
2013 | 1     | 10
2013 | 2     | 9
2013 | 3     | 11
2013 | 4     | 4

现在您可以按月查询数据。

这就是您必须如何处理数据设计才能以您想要的方式查询数据。

希望这可以帮助。

于 2013-08-15T11:13:24.123 回答
2

以标准化形式存储数据有什么问题——每个月单独一行?然后,当您想要获取特定范围时,只需使用该where子句。

SQL Server 提供了该pivot功能,可以很容易地将行值放入列中。

于 2013-08-15T11:05:08.983 回答
0

您可以通过将其传递给语句来创建具有所需列的动态 sqlEXECUTE(@query)语句。例如

Execute ('select Jan, Feb, Mar from Table')

正如其他人所建议的那样,您需要规范化您的表,然后执行 where 子句来选择特定时期的记录。

于 2013-08-15T11:16:47.610 回答