任意数量的列和行的动态枢轴



下面是示例设备表和数据。我正试图找到一种方法来转置或枢轴行成列,同时随着时间的推移添加更多的设备(行)和更多的属性(列),同时保持查询完整,但我找不到一个好的方法来做到这一点。使用SQL Server 2019。(也想知道JSON格式是否为我想做的更好的存储格式?)

所需输出:

iPad 2021  iPad mini 2021 ......
price                      329.00          499.00
Releasedate            2011-09-14      2011-09-14
ScreenSize                   10.2             8.3
ScreenResolutionWidth        1620            1488
ScreenResolutionHeight       2160            2266
.....

属性的值可以是数字、字符串、日期、布尔值或null。

创建表和数据的SQL:

CREATE TABLE [device](
[id] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](100) NULL,
[price] [decimal](18, 2) NULL,
[Releasedate] [date] NULL,
[ScreenSize] [decimal](18, 1) NULL,
[ScreenResolutionWidth] [int] NULL,
[ScreenResolutionHeight] [int] NULL
)
SET DATEFORMAT ymd
INSERT INTO [device] (Name, price, Releasedate, ScreenSize, ScreenResolutionWidth, ScreenResolutionHeight) VALUES
('iPad 2021', 329.00, CONVERT(DATETIME, '2011-09-14', 120), 10.2, 1620, 2160),
('iPad mini 2021', 499.00, CONVERT(DATETIME, '2021-09-14', 120), 8.3, 1488, 2266)

下面是对任意数量的列和行使用动态透视的最佳示例。在经历了许多解决方案后,如果写在下面一个是最好的。请将您的查询转换为它,并更改数据库名称和表。

declare @col  varchar(500)
select @col = coalesce(@col+',', '') +name FROM  tempdb.sys.columns 
WHERE object_id = OBJECT_ID('DB_NAME..TABLE_NAME') 
set @sql = 'SELECT RTE_Columns.for_emp_person, EMPNO, RTE_Columns.emp_info_code, ROW_NUMBER() OVER(ORDER BY (SELECT 1)) ser_no,  Columns_code, Data_Value 
FROM   
(SELECT *
FROM #COLUMNS_VALUES) p  
UNPIVOT  
(Data_Value FOR Columns_code IN   
('+@col+')  
)AS unpvt
join  RTE_Columns on
unpvt.Columns_code  =   RTE_Columns.desc_code ;';

EXEc sp_executesql   @sql;

相关内容

  • 没有找到相关文章

最新更新