回答
因为你基本上是旋转你当前的列Sale
,Income
和Profit
转换为行,然后将month
值移动到列中,那么您将首先取消转移当前列,然后转动月份。
根据您的SQL Server版本,有几种方法可以取消数据传输。您可以使用UNPIVOT功能或CROSS APPLY:
select month, type, value
from yourtable
cross apply
(
select 'Sale', sale union all
select 'Income', Income union all
select 'Profit', Profit
) c (type, value)
见SQL Fiddle with Demo。这会将您当前的数据转换为:
| MONTH | TYPE | VALUE |
|-------|--------|-------|
| Jan | Sale | 100 |
| Jan | Income | 50 |
| Jan | Profit | 10 |
| Feb | Sale | 20 |
| Feb | Income | 40 |
然后,您可以使用PIVOT功能将月份转换为列标题。
select type, Jan, Feb, Mar, Apr
from
(
select month, type, value
from yourtable
cross apply
(
select 'Sale', sale union all
select 'Income', Income union all
select 'Profit', Profit
) c (type, value)
) d
pivot
(
sum(value)
for month in (Jan, Feb, Mar, Apr)
) piv;
,如果你有一个未知的数个月,那么你可以使用动态SQL:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct N',' + QUOTENAME(Month)
from yourtable
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = N'SELECT type, ' + @cols + N'
from
(
select month, type, value
from yourtable
cross apply
(
select ''Sale'', sale union all
select ''Income'', Income union all
select ''Profit'', Profit
) c (type, value)
) x
pivot
(
sum(value)
for month in (' + @cols + N')
) p '
execute sp_executesql @query;
解决方案看起来不错。谢谢bluefeet。但是在编写查询时,它的动态并不知道月份列表。它也可能会延续到十二月。所以今天当我运行到四月时,明天可能要到六月。任何想法如何解决? –
@KrishnarajBarvathaya看到我的编辑,你将不得不使用动态sql。你的月份值实际上是一个字符串 - jan,feb等?或者它被存储为日期?如果代码存储为任一代码,您将不得不对代码进行一些调整,但上面的内容会让您开始。 – Taryn
是否有任何其他直接的方式将行转换为列,反之亦然?因为无论“yourtable”是不是一个简单的表。它是一个有很多条件的复杂查询。我也没有奢望去定义单独的变量和多个语句。我应该能够在一个语句中将列转换为行。 –
您可以使用UNPIVOT然后PIVOT
最好是DO QUERY嵌入式SQL 创建带有STUFF功能的月份DISTINCT COLUMS,然后 替换为oMonth IN([2013年1月-2013],[2013年2月],[2013年3月],[2013年4月])
此处核心查询
SELECT
*
FROM
( SELECT
oMonth, value,col
from (
select DATENAME(month,oDate) + '-' + CAST(YEAR( oDate) as varchar) as oMonth, Sales ,Income,Profit
FROM SalesSource
)A
unpivot
(
value for col in (Sales ,Income,Profit)
) u
) as sourceTable
PIVOT
(
sum(value)
FOR oMonth IN ([January-2013], [February-2013], [March-2013], [April-2013])
) AS PivotTable;
- 1. SQL服务器:将行转换为列
- 2. 转换一些列与列标题为行SQL服务器
- 3. SQL服务器转行的列值
- 4. SQL服务器:从CTE转换行到列
- 5. SQL服务器:打开行转换成列
- 6. 如何将行转换为SQL服务器中的列
- 7. SQL服务器:如何将行转换成列
- 8. SQL服务器:转换行到列的无支点和分组
- 9. SQL服务器:转换多列到一个列
- 10. SQL服务器转换错误
- 11. SQL服务器转换输出到HTML
- 12. SQL服务器的类型转换
- 13. 转换为varchar日期 - SQL服务器
- 14. SQL服务器到Oracle查询转换
- 15. SQL服务器 - 日期转换
- 16. SQL服务器Oracle查询转换
- 17. 日期转换Oracle到SQL服务器
- 18. SQL(服务器)日期转换
- 19. 转换SQL服务器脚本到MySQL
- 20. 转换和子在SQL服务器
- 21. 怎么行转换为列,如果列SQL服务器的数目不详
- 22. 转列转换为行SQL
- 23. SQL服务器:转换从字符串转换为uniqueidentifier
- 24. 转换字符串转换成int SQL服务器
- 25. SQL服务器:转换转换为varchar值 '1,2' 失败时
- 26. SQL服务器将字符串转换为日期列
- 27. 转换VARCHAR列于日期时间格式 - SQL服务器
- 28. SQL服务器 - 试图列转换为XML失败
- 29. SQL服务器行
- 30. SQL服务器在查询前执行日期转换
听起来像你想要的枢纽。 –
搜索数据透视表和sql。 – Mihai
你打算如何显示数据?像这样旋转在报表和应用中比在SQL中更容易实现。 –