gpt4 book ai didi

sql - 在 SQL Server 2005 中将列显示为行

转载 作者:行者123 更新时间:2023-12-04 15:12:56 24 4
gpt4 key购买 nike

我已经阅读了数十种解决类似换位问题的解决方案,但奇怪的是,没有一个能完全反射(reflect)我的问题。我只是想在一个简单的仪表板类型数据集中将我的行翻转到列。

从各种事务表中提取的数据如下所示:

DatePeriod  PeriodNumberOverall   Transactions   Customers   Visits

'Jan 2012' 1 100 50 150
'Feb 2012' 2 200 100 300
'Mar 2012' 3 300 200 600

我希望能够生成以下内容:
                      Jan 2012   Feb 2012   Mar 2012

Transactions 100 200 300
Customers 50 100 200
Visits 150 300 600

指标将是静态的(交易、客户和访问),但日期周期将是动态的(IE - 随着月份的推移添加更多)。

同样,我已经准备了许多利用 pivot、unpivot、存储过程、UNION ALL 等的示例,但我没有做任何聚合,只是从字面上转置整个输出。我还找到了一种在 Visual Studio 2005 中使用带有嵌入列表的矩阵的简单方法,但我无法将最终输出导出到 excel,这是必需的。任何帮助将不胜感激。

最佳答案

为了得到你想要的结果,你首先需要UNPIVOT数据然后PIVOT the DatePeriod` 值。

UNPIVOT 将转换 Transactions 的多列, CustomersVisits分成多行。其他答案使用 UNION ALL转轴,但 SQL Server 2005 是第一年 UNPIVOT功能得到支持。

取消数据透视的查询是:

select dateperiod,
col, value
from transactions
unpivot
(
value for col in (Transactions, Customers, Visits)
) u

Demo .这会将您当前的列转换为多行,因此数据如下所示:
| DATEPERIOD |          COL | VALUE |
-------------------------------------
| Jan 2012 | Transactions | 100 |
| Jan 2012 | Customers | 50 |
| Jan 2012 | Visits | 150 |
| Feb 2012 | Transactions | 200 |

现在,由于数据在行中,您可以应用 PIVOT函数到 DatePeriod柱子:
select col, [Jan 2012], [Feb 2012], [Mar 2012]
from
(
select dateperiod,
t.col, value, c.SortOrder
from
(
select dateperiod,
col, value
from transactions
unpivot
(
value for col in (Transactions, Customers, Visits)
) u
) t
inner join
(
select 'Transactions' col, 1 SortOrder
union all
select 'Customers' col, 2 SortOrder
union all
select 'Visits' col, 3 SortOrder
) c
on t.col = c.col
) d
pivot
(
sum(value)
for dateperiod in ([Jan 2012], [Feb 2012], [Mar 2012])
) piv
order by SortOrder;

SQL Fiddle with Demo .

如果您有未知数量的日期周期,那么您将使用动态 SQL:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(dateperiod)
from transactions
group by dateperiod, PeriodNumberOverall
order by PeriodNumberOverall
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')

set @query = 'SELECT col, ' + @cols + '
from
(
select dateperiod,
t.col, value, c.SortOrder
from
(
select dateperiod,
col, value
from transactions
unpivot
(
value for col in (Transactions, Customers, Visits)
) u
) t
inner join
(
select ''Transactions'' col, 1 SortOrder
union all
select ''Customers'' col, 2 SortOrder
union all
select ''Visits'' col, 3 SortOrder
) c
on t.col = c.col
) x
pivot
(
sum(value)
for dateperiod in (' + @cols + ')
) p
order by SortOrder'

execute(@query)

SQL Fiddle with Demo .两者都会给出结果:
|          COL | JAN 2012 | FEB 2012 | MAR 2012 |
-------------------------------------------------
| Transactions | 100 | 200 | 300 |
| Customers | 50 | 100 | 200 |
| Visits | 150 | 300 | 600 |

关于sql - 在 SQL Server 2005 中将列显示为行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15757634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com