【问题标题】:SQL Transpose rows to columns (group by key variable) NOT using pivotSQL将行转置为列(按键变量分组)不使用数据透视
【发布时间】:2015-04-16 16:19:39
【问题描述】:

以下代码几乎可以满足我的需求,除了我应该动态生成列 (p1,p2,p3...) 并且我不能使用数据透视表(请参阅 SQL Transpose rows to columns (group by key variable))。

我现在在 SQL Server 2008 中使用的是什么:

Select InvoiceNum, 
Max(Case when seq =0  Then product_Description end) as p1,
Max(Case when seq =1 Then product_Description end) as p2

 From  

( Select InvoiceNum, Product_Description,

    Row_Number() Over(Partition by InvoiceNum
        Order by InvoiceNum) - 1 seq

From #tmpTable
)d
 Group by InvoiceNum

感谢 StackOverFlow 社区!!

【问题讨论】:

  • 您需要使用动态 sql。您链接到的问题包括如何执行此操作的示例。哦,您可以为此使用 PIVOT。
  • 我在“PIVOT”附近收到“语法错误”。您可能需要将当前数据库的兼容级别设置为更高的值才能启用此功能。请参阅 ALTER DATABASE 的 SET COMPATIBILITY_LEVEL 选项的帮助。'
  • 我没有权限这样做。
  • 您是否尝试过像链接中的示例那样编写任何动态sql?
  • 您可以将其作为交叉表来执行。无论如何,我更喜欢 PIVOT。它稍微快一点,更容易阅读恕我直言,即使在旧版兼容级别下也能工作。 sqlservercentral.com/articles/T-SQL/63681sqlservercentral.com/articles/Crosstab/65048

标签: sql-server tsql pivot transpose


【解决方案1】:

我认为,就像 cmets 所说的那样,您应该将动态 SQL 与 PIVOT 表一起使用。它可能比这更有效。

创建表并在其中放入一些数据:

create table invoiceTable (
    InvoiceNum int,
    Product_Description nvarchar(20)
)

insert into invoiceTable values (1, 'inv1 row 1'),(1, 'inv1 row 2'),(1, 'inv1 row 3'),(2, 'inv2 row 1'),(2, 'inv2 row 2')

声明必要的变量

declare @maxNo int
declare @query nvarchar(max)
declare @i int = 0

找到最大行数:

select @maxNo = max(seq) from 
    (
    Select 
         InvoiceNum
        ,Product_Description
        ,Row_Number() Over(Partition by InvoiceNum Order by InvoiceNum) - 1 seq
    From 
        invoiceTable
    ) maxRowNo

构建动态查询

set @query = 
'
Select 
    *
From  
( 
    Select 
         InvoiceNum
        ,Product_Description
        ,Row_Number() Over(Partition by InvoiceNum Order by InvoiceNum) - 1 seq
    From 
        invoiceTable
) d
pivot
(
    min(Product_Description)
    for seq in (
    '

while (@i <= @maxNo)
begin
    if (@i > 0) set @Query += ','
    set @query += '['+CAST(@i as nvarchar)+']'

    set @i += 1;
end

set @query +=
    ')
) pvt
'

执行查询

exec sp_executesql @query

这给出了以下结果集:

InvoiceNum  0           1           2
1           inv1 row 1  inv1 row 2  inv1 row 3
2           inv2 row 1  inv2 row 2  NULL

【讨论】:

    猜你喜欢
    • 2013-10-27
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    相关资源
    最近更新 更多