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

SQL转置全表

陈龙野
2023-03-14
问题内容

我需要在MS SQL中进行以下转置

从:

Day  A  B 
---------
Mon  1  2
Tue  3  4
Wed  5  6
Thu  7  8
Fri  9  0

要以下内容:

Value Mon Tue Wed Thu Fri 
--------------------------
A      1   3   5   7   9
B      2   4   6   8   0

我了解PIVOT只有一列(A)时该如何处理,但无法弄清有多列要转置(A,B,…)时该如何做。

要转置的示例代码:

select LEFT(datename(dw,datetime),3) as DateWeek, 
  sum(ACalls) as A, 
  Sum(BCalls) as B 
from DataTable
group by LEFT(datename(dw,datetime),3)

表结构:

Column DataType
DateTime Datetime
ACalls int
BCalls int

任何帮助都感激不尽。


问题答案:

为了将数据转置为所需的结果,您将需要同时使用UNPIVOTPIVOT函数。

UNPIVOT函数采用AB列,并将结果转换为行。然后,您将使用该PIVOT函数将day值转换为列:

select *
from
(
  select day, col, value
  from yourtable
  unpivot
  (
    value
    for col in (A, B)
  ) unpiv
) src
pivot
(
  max(value)
  for day in (Mon, Tue, Wed, Thu, Fri)
) piv

请参阅带有演示的SQL Fiddle。

如果使用的是SQL Server 2008+,则可以使用CROSS APPLYwithVALUES取消透视数据。您的代码将更改为以下内容:

select *
from
(
  select day, col, value
  from yourtable
  cross apply
  (
    values ('A', A),('B', B)
  ) c (col, value)
) src
pivot
(
  max(value)
  for day in (Mon, Tue, Wed, Thu, Fri)
) piv

请参阅带有演示的SQL Fiddle。

编辑#1,将当前查询应用到上述解决方案中,您将使用类似于以下内容的内容:

select *
from
(
  select LEFT(datename(dw,datetime),3) as DateWeek,
    col, 
    value
  from DataTable 
  cross apply 
  (
    values ('A', ACalls), ('B', BCalls)
  ) c (col, value)
) src
pivot
(
  sum(value)
  for dateweek in (Mon, Tue, Wed, Thu, Fri)
) piv


 类似资料:
  • 问题内容: 在我开始之前,我知道关于Stackoverflow的问题很多,但是我找不到与我的案子相关的任何问题,因为它们涉及的问题比我需要的复杂得多。 我想要的是一个简单的哑转置,不涉及逻辑。 这是我的选择查询返回的原始表: 通常,这将仅包含1条记录,即一个人的记录 现在我想要的是 因此,无需像Stackoverflow上的大多数类似问题那样进行计数,求和或任何复杂的逻辑。 我该怎么做?我通读了P

  • 问题内容: 下表显示了很多有关移调的问题… 到这张桌子。 但是,我需要做相反的事情,并且难以解决这个问题。有人可以帮忙吗? 谢谢你。 问题答案: 您可以使用UNION子句非常简单地执行此操作:

  • 问题内容: 我有类似下表的内容: 我需要一个查询,它会给我这样的结果: 请注意,FieldName中的值不限于用户名,密码和电子邮件地址。它们可以是用户定义的任何东西。 有没有办法在SQL中做到这一点? 问题答案: MySQL不支持ANSI PIVOT / UNPIVOT语法,因此您可以使用: 如您所见,需要按值定义CASE语句。要使其动态化,您需要使用MySQL的Prepared Stateme

  • 问题内容: 我有一个表,其中包含几列,包括一个键值对。想象一下: 我需要将其转换为以下格式: 即换位单元格-我将如何在SQL中做到这一点? 问题答案: 像这样吗? http://technet.microsoft.com/zh- cn/library/ms177410(SQL.105).aspx

  • 问题内容: 我正在尝试将行转置为列,但是没有找到任何好的答案。 这是我想要的示例: 输入表: 输出将是: 问题答案: 您需要枚举值以对其进行透视:

  • 问题内容: 我有一个CSV导入到我们的数据库。“列”之一包含 应 为INT的数据,但某些行的数字仅落在BIGINT范围内(因为它们是来自我们合作伙伴之一的测试数据)。我们在内部存储INT,不希望更改。 我想从BIGINT安全地转换为INT。安全地说,如果发生算术溢出,则不会出现任何错误。如果转换成功,我希望我的脚本继续进行。如果失败,我希望它短路。我似乎无法弄清楚正确的语法。这就是我得到的: 我曾