没有动态 SQL 语句的动态数据透视列?
Dynamic pivot columns without dynamic SQL statement?
我只是想知道是否有任何方法可以使用动态列名进行数据透视查询,而不求助于动态 sql(declare @sql_text varchar(max) = 'select ...'
等)
动态 SQL 只是让我感到不快。
基本上我有这样的查询(我必须更改所有 table/column 名称以保护 IP,所以如果某处存在语法错误,请不要担心)
declare @sec_class_ids table (CLASS_ID varchar(50));
insert @sec_class_ids (CLASS_ID) values
('987987987'), -- END USER - SAVE AND EXPORT [987987987]
('654654654'), -- END USER - SAVE [654654654]
('321321321') -- 'END USER - SPECIAL - SAVE AND EXPORT [321321321]'
select * from (
select
class.NAME as sec_class_name,
sec_attr.NAME as sec_attr,
'YES' as granted
from sec_class class
inner join class_sec_attr
on class.class_id = class_sec_attr.class_id
inner join sec_attr
on sec_attr.sec_attr_id = class_sec_attr.sec_attr_id
inner join @sec_class_ids input
on input.class_id = class.class_id
) as sec_attrs
pivot (
max(sec_attrs.granted)
--for sec_attrs.sec_class_id in (@sec_class_ids)
for sec_points.sec_class_name in ([END USER - SAVE AND EXPORT],[END USER - SAVE],[END USER - SPECIAL - SAVE AND EXPORT])
) as sec_class_comparison
;
我希望能够使用 table var (在评论中显示) 而不是手动设置每个查询的列。我知道使用动态 SQL 这是可能的并且非常容易,但我想尽可能避免以任何方式这样做。
不幸的是,没有动态 SQL 就无法做到这一点。 PIVOT 要求在执行查询时知道这些值,因此如果您有未知名称,则必须使用动态 SQL.
我从未听说过通过查询执行此操作的方法,但我记得我能够在报告 (SSRS) 中进行设置,这非常简洁。根据您打算如何处理数据,这可能对您有用。
我只是想知道是否有任何方法可以使用动态列名进行数据透视查询,而不求助于动态 sql(declare @sql_text varchar(max) = 'select ...'
等)
动态 SQL 只是让我感到不快。
基本上我有这样的查询(我必须更改所有 table/column 名称以保护 IP,所以如果某处存在语法错误,请不要担心)
declare @sec_class_ids table (CLASS_ID varchar(50));
insert @sec_class_ids (CLASS_ID) values
('987987987'), -- END USER - SAVE AND EXPORT [987987987]
('654654654'), -- END USER - SAVE [654654654]
('321321321') -- 'END USER - SPECIAL - SAVE AND EXPORT [321321321]'
select * from (
select
class.NAME as sec_class_name,
sec_attr.NAME as sec_attr,
'YES' as granted
from sec_class class
inner join class_sec_attr
on class.class_id = class_sec_attr.class_id
inner join sec_attr
on sec_attr.sec_attr_id = class_sec_attr.sec_attr_id
inner join @sec_class_ids input
on input.class_id = class.class_id
) as sec_attrs
pivot (
max(sec_attrs.granted)
--for sec_attrs.sec_class_id in (@sec_class_ids)
for sec_points.sec_class_name in ([END USER - SAVE AND EXPORT],[END USER - SAVE],[END USER - SPECIAL - SAVE AND EXPORT])
) as sec_class_comparison
;
我希望能够使用 table var (在评论中显示) 而不是手动设置每个查询的列。我知道使用动态 SQL 这是可能的并且非常容易,但我想尽可能避免以任何方式这样做。
不幸的是,没有动态 SQL 就无法做到这一点。 PIVOT 要求在执行查询时知道这些值,因此如果您有未知名称,则必须使用动态 SQL.
我从未听说过通过查询执行此操作的方法,但我记得我能够在报告 (SSRS) 中进行设置,这非常简洁。根据您打算如何处理数据,这可能对您有用。