【问题标题】:Dynamic pivot for any number of columns and rows [duplicate]任意数量的列和行的动态枢轴[重复]
【发布时间】:2021-11-26 07:29:40
【问题描述】:

我有下面的示例设备表和数据。我正在尝试找到一种将行转置或旋转为列的方法,同时随着时间的推移添加更多设备(行)和更多属性(列),同时保持查询完整,但我找不到这样做的好方法。使用 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
.....

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

创建表和数据的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)

【问题讨论】:

  • 这能回答你的问题吗? SQL Server dynamic PIVOT query?
  • 它没有。问题和答案与固定的列数有关,它不是同一类型的布局,它不能解决在能够处理不同的列和行数的同时保持查询相同的问题。
  • 链接的欺骗不是固定的行数。这就是为什么它是动态的
  • 动态列数呢?
  • 如果表的定义发生变化,您将更新引用它的查询;这是正常的开发周期。您可以根据当前定义构建动态数据透视表,如果将来需要添加新列,也可以将该列添加到查询中。动态枢轴不会改变这一点。它仍然是一个需要更新的查询。不要尝试进行动态的动态查询,那是疯狂的道路。

标签: sql sql-server tsql pivot sql-server-2019


【解决方案1】:

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

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;

【讨论】:

  • 这是一个动态的Unpivot,而不是pivot。这会将列变成行,而不是相反。
  • 哦,我只是再给你分享一个。
  • 除了不能回答问题之外,还有其他问题:当表格位于 DB_NAME 中时,从 tempdb 中选择。应该使用QUOTENAME 作为列名。应该使用FOR XMLSTRING_AGG 而不是变量合并(这是不可靠的)
  • 你知道I've already linked that one,@MDanish,对吧?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
  • 2017-03-02
  • 2017-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多