下面是示例设备表和数据。我正试图找到一种方法来转置或枢轴行成列,同时随着时间的推移添加更多的设备(行)和更多的属性(列),同时保持查询完整,但我找不到一个好的方法来做到这一点。使用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;