【问题标题】:SQL Server Array or dynamic field headings or pivot [closed]SQL Server 数组或动态字段标题或数据透视 [关闭]
【发布时间】:2017-02-12 10:02:52
【问题描述】:

我正在使用 SQL Server 2012,但不确定解决问题的最佳方法。这是我的数据:

Item   Size   SortOrder    Qty
ABC    XS      1            0
ABC    S       2            8
ABC    M       3            4
ABC    L       4            3
ZXY    1       1            10
DEF    6       1            5
DEF    8       2            4
DEF    10      3            7
DEF    12      4            6
QWE    1       1            5

但是,我需要以网格格式呈现,并且大小需要随着标题动态变化:

ABC   XS   S   M   L
Qty   0    8   4   3
ZXY   1
Qty   10
DEF   6    8   10   12
Qty   5    4   7     6
QWE   1
Qty   5

我还需要将数量分配给适当的大小,并且大小必须始终按照排序顺序从左到右显示。

最好的方法是什么?创建数组还是可以在枢轴中实现上述目标?

谢谢。

我尝试使用以下内容进行旋转,但不断收到错误“列名无效”:

DECLARE @SizeColums VARCHAR(MAX)
SELECT  @SizeColums = COALESCE(@SizeColums + ',','') + QUOTENAME([Size])
FROM    vw_SizeSeq 
GROUP BY [Size]

DECLARE @Sql NVARCHAR(MAX) = N'
    SELECT  Item,
            [Types],' +
            @SizeColums + '
    FROM    (SELECT * FROM vw_SizeSeq 
    ) t
    UNPIVOT ( 
         [Type]
        FOR [Types] IN ([Item])) up
    PIVOT (
        MAX([Type])
        FOR [Size] IN (' + @SizeColums + ')
    ) p
'

EXEC sp_executesql @sql;

【问题讨论】:

  • 在 SQL 中,我们只能生成表格格式的结果,但您的预期结果看起来有些不同。为此尝试应用层
  • 它们必须是一种旋转和反旋转的方式
  • 可能是我不理解您的预期结果格式。你能说得更清楚一些吗
  • 把它想象成一个网格\枢轴\交叉表,其中的大小需要是动态的

标签: sql arrays sql-server dynamic pivot


【解决方案1】:

不漂亮,但我认为这可能有用

Declare @XML xml = (Select Item,Size,SortOrder,Qty=isnull(Qty,0) from YourTable for XML RAW),@SQL varchar(max) = ''

-- Create SQL for columns
Select @SQL = @SQL+',Col'+cast(SortOrder as varchar(25))+' = max(case when ColNr='+cast(SortOrder as varchar(25))+' then Value else '''' end)'+char(13)
 From  (Select Distinct SortOrder From YourTable) A Order by SortOrder

-- Normalize Data
Select Itm      = r.value('@Item','varchar(25)')
      ,ColNr     = r.value('@SortOrder','int')
      ,Attribute = attr.value('local-name(.)','varchar(100)')
      ,Value     = attr.value('.','varchar(max)')
 Into  #Temp
 From  @XML.nodes('/row') as A(r)
 Cross Apply A.r.nodes('./@*') AS B(attr)
 Where attr.value('local-name(.)','varchar(100)') not in ('Item','SortOrder')

-- Create Final SQL and Execute
Set @SQL = 'Select Item=case when Attribute=''Qty'' then '''' else Itm end'+@SQL+' From #Temp Group By Itm,Attribute Order By Itm,Attribute Desc'
Exec(@SQL)

返回

Item    Col1    Col2    Col3    Col4
ABC     XS      S       M       L
        0       8       4       3
DEF     6       8       10      12
        5       4       7       6
QWE     1           
        5           
ZXY     1           
        10          

【讨论】:

  • 谢谢。虽然我没有得到相同的结果 - 我得到的项目在左边是正确的,但是顶部的所有可能的排序顺序号作为列标题 - 我需要这些作为项目大小。
  • 没有。每个项目可以有不同的尺寸范围。在顶部的原始数据中,Item ABC 的尺寸为 XS \ S \ M \ L,DEF 的尺寸为 6 \ 8 \ 10 \ 12 ZXY 只有尺寸 1,QWE 只有尺寸 1。这些需要是动态的列标题
  • 4 行是的,加上尺寸下的数量。我只想在项目存在尺寸时显示尺寸,尽管就像我原始帖子第二部分中的结果一样
  • @Michael 显然我不了解您的要求。据我所见,我的结果反映了您发布的内容,但空白行和重复项除外。如果您希望每个项目有不同的列名(和计数),那将是多个数据集
  • 好的,感谢您的帮助。
猜你喜欢
  • 2015-06-08
  • 2014-10-16
  • 2014-07-26
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
  • 2013-02-09
  • 2018-11-22
相关资源
最近更新 更多