【问题标题】:Need to PIVOT data from table in SQL需要从 SQL 表中透视数据
【发布时间】:2021-01-07 09:56:29
【问题描述】:

我有一个名为 BasketTable 的 sql 表,其中包含类似的数据

Assists  Rebounds   Steals  Blocks  Fouls   TeamId
10        32          8       6      11       13
18        36          8       6      9         9

我想要这样的输出

StatsName    Team1   Team2
 Assists      10      18
 Rebounds     32      36
 Steals        8       8
 Blocks        6       6
 Fouls        11       9

如果示例中有 3 行,则在输出中添加第三个团队数据列

我正在为此尝试此查询

select StatsName, HomeTeam from 
(
select Assists, DefensiveRebounds as Rebounds, Steals, Blocks, PersonalFouls as Fouls
from CombinationStatistics cs
where GameId = 1082960
) x
 unpivot (
    HomeTeam for StatsName IN (Assists, Rebounds, Steals, Blocks, Fouls)
 ) p

上面的查询给我这个输出,

StatsName   HomeTeam
Assists       10
Rebounds      32
Steals         8
Blocks         6
Fouls         11
Assists       18
Rebounds      36
Steals         8
Blocks         6
Fouls          9

我知道那是错误的,我想要第二个团队的另一个专栏,现在它在一个专栏中。如何通过 TeamId 区分数据?

【问题讨论】:

  • 那么...您的问题/问题是什么?你读过docs.microsoft.com/en-us/sql/t-sql/queries/…了吗?
  • 您将需要在此处进行 unpivot 和 pivot 操作。如果您的团队数量不定,那将是一些真正“混乱”的动态 SQL。我强烈建议您不要在不熟悉 SQL 的情况下这样做。似乎是您的表示层要做的事情;例如 SSRS 中的矩阵或 Microsoft Excel 中的数据透视表。
  • 您需要添加TeamID。就是这样!
  • 我添加了 TeamID,但它不起作用@MaciejLos
  • 这不是“全部”@MaciejLos。然后,OP 将需要转置他们未转置的数据,即便如此,它也只能处理 2 个团队,超过 2 个。

标签: sql sql-server pivot-table unpivot


【解决方案1】:

这适用于特定数量的团队,在本例中为 2。但是,如果您有更多团队,它不会返回更多列。那是因为做到这一点的唯一方法是使用动态 SQL,老实说,取消透视,然后动态旋转是混乱的,而不是你应该在 SQL 中做的事情。这是表示层的工作。

WITH RNs AS(
    SELECT Assists,
           Rebounds,
           Steals,
           Blocks,
           Fouls,
           TeamId,
           ROW_NUMBER() OVER (ORDER BY TeamID DESC) AS RN
   FROM dbo.YourTable),
Unpvt AS(
    SELECT RN.RN,
           V.StatName,
           V.StatNumber
    FROM RNs RN
         CROSS APPLY (VALUES('Assists',RN.Assists),
                            ('Rebounds',RN.Rebounds),
                            ('Steals',RN.Steals),
                            ('Fouls',RN.Fouls))V(StatName,StatNumber))
SELECT U.StatName,
       MAX(CASE U.RN WHEN 1 THEN StatNumber END) AS Team1,
       MAX(CASE U.RN WHEN 2 THEN StatNumber END) AS Team2
FROM Unpvt U;
           

当然,如果您不了解上述内容,则不应该采用动态方法,因为您没有希望支持它;需要支持的是你,而不是 Stack Overflow 上的社区。​​p>

【讨论】:

    【解决方案2】:

    正如@Larnu 提到的,您需要取消透视数据并再次透视它们。见:

    SELECT StatsName, [9], [13]
    FROM
    (
      SELECT TeamId, StatsName, HomeTeam
      FROM
      (
        SELECT 10 Assists, 32 Rebounds, 8  Steals, 6 Blocks, 11 Fouls, 13  TeamId
        UNION ALL
        SELECT 18 Assists, 36 Rebounds, 8  Steals, 6 Blocks, 9 Fouls, 9  TeamId
      ) pvt
      unpivot
      (
        HomeTeam for StatsName IN (Assists, Rebounds, Steals, Blocks, Fouls)
      ) unpvt
    ) src
    pivot(SUM(HomeTeam) for TeamId IN([9], [13])) final
    

    db_fiddle

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-01-23
      • 1970-01-01
      • 2021-01-19
      • 2011-03-24
      • 2022-07-21
      • 1970-01-01
      相关资源
      最近更新 更多