当前位置: 首页 > 面试题库 >

在SQL Server中使用“数据透视表”将行转换为列

赖鸿羲
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

将数字存储在侧面,数周存储在顶部。


问题答案:

如果使用的是SQL Server 2005+,则可以使用该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 |


 类似资料:
  • 问题内容: 我正在使用Oracle 12c R1 db并具有以下示例数据的示例视图: 视图名称: CUST_HOTEL_VIEW 从上面的数据中,我试图通过Row Grand Total,Column Grand Total和每位客户预订的酒店数量低于数据透视表的输出: 我尝试在下面的查询中生成数据透视表 我想知道: 1.如何包括行总计 2.如何包括列总计 3.如何包括预订酒店的数量以及 3.是否

  • 问题内容: 我想从Table1转换数据,如您在数据透视表中的第一张图片上所见。在MySQL中可以做到吗?因为数据透视表(A,B,C,D)的值是varchar数据格式,所以我不能使用MySQL的任何聚合函数(例如SUM或其他函数)。 谢谢你的帮助 问题答案: 静态查询(就Bob和Sue而言)可能看起来像这样 现在可以使用动态SQL来解释其他名称 输出: 这是 SQLFiddle 演示 您可以将其包装

  • 问题内容: 我需要知道,如果没有聚合函数要使用,MS SQL中的“数据透视”是否可以用于将行转换为列。我看到了很多仅带有聚合函数的示例。我的字段是字符串数据类型,我需要将此行数据转换为列数据。这就是为什么我写这个问题。我只是用’case’做到了。谁能帮我......提前感谢。 问题答案: 您可以使用PIVOT执行此操作。在执行PIVOT时,可以使用以下两种方法之一进行操作:使用“静态数据透视表”(

  • 我有一个数据框,在完成分组后得到,如下所示:- 我想将其转换为:-

  • 问题内容: MS SQL Server 2012 我有一个名为 indexrows* 的表 * 我想将这些结果转换为如下形式。 我尝试了以下查询,但未成功。我得到这个错误 消息156,级别15,状态1,第10行关键字“ for”附近的语法错误。 任何帮助表示赞赏。 问题答案: 您的查询有些错误。 首先,您在PIVOT上缺少聚合函数。您需要一个汇总。 其次,您需要用方括号而不是单引号将。等括起来。

  • 问题内容: 我正在使用SQL Server 2008,并且希望将数据转换为: 资料集: 所需结果: 目前,我正在执行以下操作,然后将所需的列粘贴到Excel中: 但是,并非所有匹配的行都不能仅仅并排击打表。对于没有Result的列,我希望显示NULL来填充行以使它们都具有相同数量的记录。 我查了一下PIVOT,但我认为这在这里不起作用…这种数据转换称为什么类型?我不认为这是交叉表… 谢谢! 问题答