在 SELECT 查询 SQL 中生成动态日期列
Generate dynamic date columns in a SELECT query SQL
首先我有一个 table 这样的:
vID
bID
date
type
value
1
100
22.01.2021
o
250.00
1
110
25.01.2021
c
100.00
2
120
13.02.2021
o
400.00
3
130
20.02.2021
o
475.00
3
140
11.03.2022
c
75.00
1
150
15.03.2022
o
560.00
要显示每月订购 (o) 和收费 (c) 的值,我必须喜欢 'generate' 每个月在 MS 中订购和收费的列 SQL SELECT查询。
这是我想要得到的示例 table:
vID
JAN2021O
JAN2021C
FEB2021O
FEB2021C
…
MAR2022O
MAR2022C
1
250.00
100.00
560.00
2
400.00
3
475.00
75.00
除了我已经拥有的其他一些专栏之外,我还需要一个 SQL SELECT 的机会。
有没有人有想法可以帮助我?
SQL 语言有一个非常严格的要求要知道列数[=结果中的 36=] 和查询编译时每列的 类型 ,然后查看 table 中的 any 数据.这甚至适用于 SELECT *
和 PIVOT
查询,其中列仍然在查询编译时通过 table 定义(不是数据)或 SQL 语句确定。
因此,如果您想要显示从基准日期算起的特定已知月数,那么您想要执行的操作只能在单个查询中实现。在这种情况下,您可以通过指定 SQL 中的每一列并使用带有条件聚合的日期数学来计算从起点开始的每个月的值来完成此操作。 PIVOT
关键字有助于减少代码,但您仍然需要手动指定每一列,而且查询仍然很复杂。
如果您没有具体的、已知的月数来评估,则必须分几个步骤进行:
- 运行 查询以了解您有多少个月。
- 使用步骤 1 的结果动态构造新语句
- 运行步骤2中构造的语句。
没别的办法了
即便如此,与通过 SQL 本身相比,在客户端代码或报告工具(在表示层)中通常可以更好地处理这种数据透视。
对于这个特定的查询不太可能出现,但您也应该知道这种动态 SQL 可能会引发某些安全问题,因为一些正常的机制会在步骤 2 中构建新查询时,防止注入问题不可用(您无法参数化源列的名称,这些名称取决于可能由用户生成的数据)。
首先我有一个 table 这样的:
vID | bID | date | type | value |
---|---|---|---|---|
1 | 100 | 22.01.2021 | o | 250.00 |
1 | 110 | 25.01.2021 | c | 100.00 |
2 | 120 | 13.02.2021 | o | 400.00 |
3 | 130 | 20.02.2021 | o | 475.00 |
3 | 140 | 11.03.2022 | c | 75.00 |
1 | 150 | 15.03.2022 | o | 560.00 |
要显示每月订购 (o) 和收费 (c) 的值,我必须喜欢 'generate' 每个月在 MS 中订购和收费的列 SQL SELECT查询。 这是我想要得到的示例 table:
vID | JAN2021O | JAN2021C | FEB2021O | FEB2021C | … | MAR2022O | MAR2022C |
---|---|---|---|---|---|---|---|
1 | 250.00 | 100.00 | 560.00 | ||||
2 | 400.00 | ||||||
3 | 475.00 | 75.00 |
除了我已经拥有的其他一些专栏之外,我还需要一个 SQL SELECT 的机会。
有没有人有想法可以帮助我?
SQL 语言有一个非常严格的要求要知道列数[=结果中的 36=] 和查询编译时每列的 类型 ,然后查看 table 中的 any 数据.这甚至适用于 SELECT *
和 PIVOT
查询,其中列仍然在查询编译时通过 table 定义(不是数据)或 SQL 语句确定。
因此,如果您想要显示从基准日期算起的特定已知月数,那么您想要执行的操作只能在单个查询中实现。在这种情况下,您可以通过指定 SQL 中的每一列并使用带有条件聚合的日期数学来计算从起点开始的每个月的值来完成此操作。 PIVOT
关键字有助于减少代码,但您仍然需要手动指定每一列,而且查询仍然很复杂。
如果您没有具体的、已知的月数来评估,则必须分几个步骤进行:
- 运行 查询以了解您有多少个月。
- 使用步骤 1 的结果动态构造新语句
- 运行步骤2中构造的语句。
没别的办法了
即便如此,与通过 SQL 本身相比,在客户端代码或报告工具(在表示层)中通常可以更好地处理这种数据透视。
对于这个特定的查询不太可能出现,但您也应该知道这种动态 SQL 可能会引发某些安全问题,因为一些正常的机制会在步骤 2 中构建新查询时,防止注入问题不可用(您无法参数化源列的名称,这些名称取决于可能由用户生成的数据)。