我不确定如何将数据透视到特定视图。以下是测试数据。
SQL
CREATE TABLE #tmpData (ProductTitle VARCHAR(100), abvrMonthName VARCHAR(3),abvrMonthNameCount VARCHAR(4),MonthAvg NUMERIC(6,2),MonthCount INT)
INSERT INTO #tmpData SELECT 'Product 1','Dec','Dec#', 0 , 0
INSERT INTO #tmpData SELECT 'Product 1','Nov','Nov#', 0 , 0
INSERT INTO #tmpData SELECT 'Product 1','Oct','Oct#', 0 , 0
INSERT INTO #tmpData SELECT 'Product 1','Sep','Sep#', 0 , 0
INSERT INTO #tmpData SELECT 'Product 1','Aug','Aug#', 0 , 0
INSERT INTO #tmpData SELECT 'Product 1','Jul','Jul#', 0 , 0
INSERT INTO #tmpData SELECT 'Product 1','Jun','Jun#', 5 , 1
INSERT INTO #tmpData SELECT 'Product 1','May','May#', 4.44 , 9
INSERT INTO #tmpData SELECT 'Product 1','Apr','Apr#', 5 , 6
INSERT INTO #tmpData SELECT 'Product 1','Mar','Mar#', 5 , 4
INSERT INTO #tmpData SELECT 'Product 1','Feb','Feb#', 5 , 1
INSERT INTO #tmpData SELECT 'Product 1','Jan','Jan#', 5 , 2
INSERT INTO #tmpData SELECT 'Product 2','Dec','Dec#', 0 , 0
INSERT INTO #tmpData SELECT 'Product 2','Nov','Nov#', 0 , 0
INSERT INTO #tmpData SELECT 'Product 2','Oct','Oct#', 0 , 0
INSERT INTO #tmpData SELECT 'Product 2','Sep','Sep#', 0 , 0
INSERT INTO #tmpData SELECT 'Product 2','Aug','Aug#', 0 , 0
INSERT INTO #tmpData SELECT 'Product 2','Jul','Jul#', 0 , 0
INSERT INTO #tmpData SELECT 'Product 2','Jun','Jun#', 5 , 1
INSERT INTO #tmpData SELECT 'Product 2','May','May#', 4.67 , 3
INSERT INTO #tmpData SELECT 'Product 2','Apr','Apr#', 4.33 , 3
INSERT INTO #tmpData SELECT 'Product 2','Mar','Mar#', 0 , 0
INSERT INTO #tmpData SELECT 'Product 2','Feb','Feb#', 0 , 0
INSERT INTO #tmpData SELECT 'Product 2','Jan','Jan#', 0 , 0
INSERT INTO #tmpData SELECT 'Product 3','Dec','Dec#', 0 , 0
INSERT INTO #tmpData SELECT 'Product 3','Nov','Nov#', 0 , 0
INSERT INTO #tmpData SELECT 'Product 3','Oct','Oct#', 0 , 0
INSERT INTO #tmpData SELECT 'Product 3','Sep','Sep#', 0 , 0
INSERT INTO #tmpData SELECT 'Product 3','Aug','Aug#', 0 , 0
INSERT INTO #tmpData SELECT 'Product 3','Jul','Jul#', 0 , 0
INSERT INTO #tmpData SELECT 'Product 3','Jun','Jun#', 5 , 3
INSERT INTO #tmpData SELECT 'Product 3','May','May#', 5 , 6
INSERT INTO #tmpData SELECT 'Product 3','Apr','Apr#', 4 , 6
INSERT INTO #tmpData SELECT 'Product 3','Mar','Mar#', 4.75 , 8
INSERT INTO #tmpData SELECT 'Product 3','Feb','Feb#', 4.75 , 8
INSERT INTO #tmpData SELECT 'Product 3','Jan','Jan#', 4.6 , 5
SELECT ProductTitle,[jan],[jan#],[feb],[feb#]
FROM
( SELECT *
FROM #tmpData
) AS s
PIVOT
(
SUM(MonthAvg) FOR abvrMonthName IN (
jan,feb,mar,apr,may,jun,jul,aug, sep, oct, nov, [dec]
)
) as p
PIVOT
(
SUM(MonthCount) FOR abvrMonthNameCount IN (
jan#,feb#,mar#,apr#,may#,jun#,jul#,aug#, sep#, oct#, nov#, [dec#]
)
) as p1
--GROUP BY ProductTitle,[jan],[feb]
DROP TABLE #tmpData
从输出中可以看到,ProductTitle
未分组。
我将如何实现这一目标?或者我会完全朝错误的方向前进?
问题的一部分是您已跨多个要透视的列对数据进行了非规范化。理想情况下,您应该考虑修复表结构,以便于维护和查询。如果无法修复表结构,则应先取消对列的透视图,然后应用PIVOT获得最终结果。
UNPIVOT流程将采用多列并将其转换为多行。根据您的SQL Server版本,有几种方法可以执行此操作。可以使用UNPIVOT函数,或者由于使用的是SQL
Server 2008,因此可以将CROSS APPLY与VALUES子句一起使用来取消透视。
交叉申请/值代码为:
select t.producttitle, c.col, c.value
from tmpData t
cross apply
(
values (abvrMonthName, MonthAvg), (abvrMonthNameCount, MonthCount)
) c (col, value)
请参阅带有演示的SQL
Fiddle
。这将占用您的多列,并将数据放入类似于以下格式的格式:
| PRODUCTTITLE | COL | VALUE |
-------------------------------
| Product 1 | Dec | 0 |
| Product 1 | Dec# | 0 |
| Product 1 | Nov | 0 |
| Product 1 | Nov# | 0 |
| Product 1 | Oct | 0 |
| Product 1 | Oct# | 0 |
| Product 1 | Sep | 0 |
| Product 1 | Sep# | 0 |
一旦数据采用这种格式,就可以将PIVOT应用于col
包含月份名称的值:
select producttitle, jan, [jan#], feb, [feb#], mar, [mar#], apr, [apr#],
may, [may#], jun, [jun#], jul, [jul#], aug, [aug#],
sep, [sep#], oct, [oct#], nov, [nov#], dec, [dec#]
from
(
select t.producttitle, c.col, c.value
from tmpData t
cross apply
(
values (abvrMonthName, MonthAvg), (abvrMonthNameCount, MonthCount)
) c (col, value)
) d
pivot
(
sum(value)
for col in (jan, [jan#], feb, [feb#], mar, [mar#], apr, [apr#],
may, [may#], jun, [jun#], jul, [jul#], aug, [aug#],
sep, [sep#], oct, [oct#], nov, [nov#], dec, [dec#])
) piv;
请参阅带有演示的SQL Fiddle。结果如下:
| PRODUCTTITLE | JAN | JAN# | FEB | FEB# | MAR | MAR# | APR | APR# | MAY | MAY# | JUN | JUN# | JUL | JUL# | AUG | AUG# | SEP | SEP# | OCT | OCT# | NOV | NOV# | DEC | DEC# |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Product 1 | 5 | 2 | 5 | 1 | 5 | 4 | 5 | 6 | 4.44 | 9 | 5 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Product 2 | 0 | 0 | 0 | 0 | 0 | 0 | 4.33 | 3 | 4.67 | 3 | 5 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| Product 3 | 4.6 | 5 | 4.75 | 8 | 4.75 | 8 | 4 | 6 | 5 | 6 | 5 | 3 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
我的问题是如何将一列拆分为多个列。我不知道为什么 不起作用。 例如,我想将“df_test”更改为“df_test2”。我看到了很多使用熊猫模块的例子。还有别的办法吗?提前感谢您。 df_test2
问题内容: 给定一个简单的模式,例如PurchaseOrders {OrderId,Total,LineItemCount},我想为一些简单的统计信息生成一个简单的查询,如下所示: 但是在Linq to Sql中,我正在努力将其纳入一个查询中。 目前,我有这个: 有没有一种方法可以将其作为一个查询来完成? 问题答案: 我能想到的是给它一个假的group-by子句。它可以正常工作,并能按您期望的那样
问题内容: 我在#temp表中具有以下数据: 我想做以下操作,即 一行将在两列上加法,即 另一行将在三列上减法加法,即 我曾尝试在SQL Server中使用case语句。 以下是所需的输出 哪里& 我曾尝试使用SQL SERVER Case语句,但未获得正确的输出 问题答案: 我看到至少有两种方法可以得到这些结果。分组或枢纽 在下面的示例中,显示了2种方法。 请注意,使用的是SUM(VALUE)而
问题内容: 当ID相同时,试图生成用逗号分隔的语言列表。 表格1: 表2: 想要生成如下结果: 我尝试过的事情: Stragg-SSIS给我“无效标识符” SYS_Connect_By_Path-无法弄清楚如何将id转换为字符串语言。 有什么建议? 问题答案: 有多种方法可以执行字符串聚合以生成逗号分隔的列表-有关更多详细信息,请参见此链接。根据链接中的示例,尝试:
本文向大家介绍Microsoft SQL Server 简单枢轴-静态列,包括了Microsoft SQL Server 简单枢轴-静态列的使用技巧和注意事项,需要的朋友参考一下 示例 使用示例数据库中的项目销售表,让我们计算并显示每个产品的总销售数量。 使用group by可以很容易地做到这一点,但假设我们以某种方式“旋转”结果表,即对于每个产品ID,我们都有一个列。 由于我们的“新”列是数字(
问题内容: 我有一个关于(MS SQL 2016)和功能的问题。首先让我解释一下数据结构。 的例子。有几种价格()为每个区域(,)在继电器()。全部连接到同一货运()。每种货物可以有不同数量的继电器。所有这些继电器重复每个区域,因此即有一个价格为继电器的面积,但还有另一种价格为继电器的区域。 该表的外观如下: 现在,我有另一个表,其中保存了继电器的数量。 该表如下所示: 现在,我想合并这些数据,这