当前位置: 首页 > 知识库问答 >
问题:

在SQL Server中使用“Pivot”将行转换为列

丌官丰羽
2023-03-14

我已经读过关于MS透视表的东西,但我仍然有问题得到正确的这一点。

我有一个正在创建的临时表,我们会说第1列是一个商店号,第2列是一个星期号,最后第3列是某种类型的总数。而且周数是动态的,商店数是静态的。

Store      Week     xCount
-------    ----     ------
102        1        96
101        1        138
105        1        37
109        1        59
101        2        282
102        2        212
105        2        78
109        2        97
105        3        60
102        3        123
101        3        220
109        3        87

我希望它作为一个透视表出来,像这样:

Store        1          2          3        4        5        6....
----- 
101        138        282        220
102         96        212        123
105         37        
109

商店的数字下侧和周横跨顶部。

共有1个答案

於乐
2023-03-14

如果使用的是SQL Server2005+,则可以使用pivot函数将数据从行转换为列。

听起来,如果周数未知,您将需要使用动态sql,但最初使用硬编码版本更容易看到正确的代码。

首先,这里有一些快速的表格定义和数据供使用:

CREATE TABLE #yt 
(
  [Store] int, 
  [Week] int, 
  [xCount] int
);

INSERT INTO #yt
(
  [Store], 
  [Week], [xCount]
)
VALUES
    (102, 1, 96),
    (101, 1, 138),
    (105, 1, 37),
    (109, 1, 59),
    (101, 2, 282),
    (102, 2, 212),
    (105, 2, 78),
    (109, 2, 97),
    (105, 3, 60),
    (102, 3, 123),
    (101, 3, 220),
    (109, 3, 87);

如果您的值是已知的,那么您将对查询进行硬编码:

select *
from 
(
  select store, week, xCount
  from yt
) src
pivot
(
  sum(xcount)
  for week in ([1], [2], [3])
) piv;

请参阅SQL演示

那么如果需要动态生成周号,您的代码将是:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(Week) 
                    from yt
                    group by Week
                    order by Week
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT store,' + @cols + ' from 
             (
                select store, week, xCount
                from yt
            ) x
            pivot 
            (
                sum(xCount)
                for week in (' + @cols + ')
            ) p '

execute(@query);

请参阅SQL演示。

动态版本生成应转换为列的week数字列表。两者都给出了相同的结果:

| STORE |   1 |   2 |   3 |
---------------------------
|   101 | 138 | 282 | 220 |
|   102 |  96 | 212 | 123 |
|   105 |  37 |  78 |  60 |
|   109 |  59 |  97 |  87 |
 类似资料:
  • 所以我的数据集有一些n个日期的位置信息。问题是每个日期实际上是不同的列标题。例如CSV看起来像 我想让它看起来像 我的问题是我不知道该列中有多少个日期(尽管我知道它们总是在name之后开始)

  • 问题内容: 需要将此查询转换为SQL Server 我已经阅读了所有其他帖子,但无法将其转换为相同的帖子 问题答案: 这是使用表运算符的等效版本: SQL小提琴演示 例如,这将为您提供: 请注意, 使用MS SQL Server表运算符时,必须输入数据透视列的值。然而,在MS Access,这是该作品是用做的,这是动态获取枢转列的值。在这种情况下,您必须与操作员一起动态地执行此操作,如下所示: 更

  • 问题内容: 我正在尝试创建一个查询,以使用PIVOT函数将行转置为列。 这是我要转置为行的表: 我的预期结果: 我的查询: 我遇到的错误: 我出现问题的原因是因为我的Oracle数据库版本(Oracle9i)不支持PIVOT功能。以下是以另一种方式进行操作的方法: 问题答案: 在以下情况中,您的陈述中有一个冒号的分号: 将其删除以使其成为: 它被视为多个语句;第一个是不完整的,因为它缺少右括号(因

  • 本文向大家介绍深入SQL中PIVOT 行列转换详解,包括了深入SQL中PIVOT 行列转换详解的使用技巧和注意事项,需要的朋友参考一下 PIVOT通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。UNPIVOT与PIVOT执行相反的操作,将表值表达式的列转换为列值。 通俗简单的说:PIVOT就是行转列,UNPIVOT就是列传行 一、

  • 我想使用spark dataframe将行转换为列。 我的桌子是这样的 我想把它转换成 我用了下面的代码:- 但我得到的结果是-- 任何人都可以帮助得到渴望的结果。

  • 问题内容: 我有以下Python pandas数据框: 我想要: 我看过pivot(),pivot_table(),Transpose和unstack(),它们似乎都没有给我。熊猫新手,所以所有帮助表示赞赏。 问题答案: 您需要通过转置: 如果需要重命名列,则有点复杂: 另一个更快的解决方案是使用: 时间 :