我需要在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
任何帮助都感激不尽。
为了将数据转置为所需的结果,您将需要同时使用UNPIVOT
和PIVOT
函数。
该UNPIVOT
函数采用A
和B
列,并将结果转换为行。然后,您将使用该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 APPLY
withVALUES
取消透视数据。您的代码将更改为以下内容:
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。安全地说,如果发生算术溢出,则不会出现任何错误。如果转换成功,我希望我的脚本继续进行。如果失败,我希望它短路。我似乎无法弄清楚正确的语法。这就是我得到的: 我曾