1. sqlServer 列轉行
sql server 請參閱下面的代碼,列轉行
sqlserver列轉行方法分享
以下例子適用 sqlserver 2005版本及以上
createtableA(info1varchar(30),
[2012]int,
[2008]int,
[2018]int,
[2013]int
)
go
insertintoAvalues('A',8,null,null,20)
insertintoAvalues('B',null,7,null,3)
insertintoAvalues('C',12,4,null,null)
insertintoAvalues('D',null,null,5,16)
go
---列行轉換適用於sqlserver2005及以上版本
SELECTinfo1,nian,qty
fromA
unpivot(qtyfornianin([2012],[2008],[2018],[2013]))astest
GO
truncatetableA
droptableA
2. SQL Server 2008列轉行問題
第一個結果的格式, 你先看看?合適不合適?
With myCTE AS (
select
ROW_NUMBER() over(partition by begin_time, end_time, LEFT(op_id,1) ORDER BY op_id) AS NO,
operator.*
from
operator
)
SELECT
begin_time AS [開始時間],
end_time AS [結束時間],
MAX(CASE WHEN LEFT(op_id,1) = '1' THEN op_id else '' END) AS [一組工號],
MAX(CASE WHEN LEFT(op_id,1) = '1' THEN work_time else NULL END) AS [工作時長],
MAX(CASE WHEN LEFT(op_id,1) = '2' THEN op_id else '' END) AS [二組工號],
MAX(CASE WHEN LEFT(op_id,1) = '2' THEN work_time else NULL END) AS [工作時長],
MAX(CASE WHEN LEFT(op_id,1) = '3' THEN op_id else '' END) AS [三組工號],
MAX(CASE WHEN LEFT(op_id,1) = '3' THEN work_time else NULL END) AS [工作時長]
FROM
myCTE
GROUP BY
begin_time, end_time, NO
第二個結果的格式
SELECT
begin_time AS [開始時間],
end_time AS [結束時間],
SUM( CASE WHEN LEFT(op_id,1) = '1' THEN 1 ELSE 0 END ) AS [一組上班人數],
SUM( CASE WHEN LEFT(op_id,1) = '2' THEN 1 ELSE 0 END ) AS [二組上班人數],
SUM( CASE WHEN LEFT(op_id,1) = '3' THEN 1 ELSE 0 END ) AS [三組上班人數]
FROM
operator
GROUP BY
begin_time, end_time
3. sqlserver 怎麼列轉行
PIVOT 用於將列值旋轉為列名(即行轉列),在 SQL Server 2000可以用聚合函數配合CASE語句實現
PIVOT 的一般語法是:PIVOT(聚合函數(列) FOR 列 in (…) )AS P
注意:PIVOT、UNPIVOT是SQL Server 2005 的語法,使用需修改資料庫兼容級別(在資料庫屬性->選項->兼容級別改為 90 )
SQL2008 中可以直接使用
完整語法:
table_source
PIVOT(
聚合函數(value_column)
FOR pivot_column
IN(<column_list>)
)
View Code
UNPIVOT 用於將列明轉為列值(即列轉行),在SQL Server 2000可以用UNION來實現
完整語法:
table_source
UNPIVOT(
value_column
FOR pivot_column
IN(<column_list>)
)
4. sql 2008兩列的表如何可以轉換為一行表
通用的辦法是用動態sql解決:
declare @sql varchar(2000);
set @sql='select ''';
select @sql=@sql+列名+',' from 表名;
select @sql=left(@sql,len(@sql)-1)+''''
exec(@sql);
此外,SQL Server2005以上版本可以用XML Path解決。
SELECT 列名+',' FROM 表名 FOR XML PATH('')
這樣將直接得到'a,b,c,d,d,e,',需要進一步處理去掉最後的逗號。
5. 關於SQL SERVER 2008 列轉行的問題
給你一個網址,說的比較詳細 http://blog.csdn.net/yubofighting/article/details/6767390
6. sql2008列轉行語句
http://blog.csdn.net/greystar/article/details/5660645
看看上面三種方法是不是你需要的。
7. SQLSERVER 列轉行
第一:你的時間維度表基本沒有意義,微軟SSIS中心認為時間維度至少由日期構成主鍵。可以認為是最小基本業務顆粒。
來個Sample,更復雜的在我空間里。但是道理是一樣的。都是藉助動態SQL和一些函數。
----------------------------------------------------------------
/*
作者:Edwin
資料庫:SQLSERVER2005+
作用:指定時間區間的自然周有幾天,如果垮年度,由外圍驗證
Version1.0
Copyright(c)2015,SQLSERVER2008
*/
----------------------------------------------------------------
/*參數設定區域,參數為開始時間和結束時間*/
----------------------------------------------------------------
declare@FDateDateTimeset@FDate='2014-09-0100:00:00.000'
declare@EdateDateTimeset@Edate='2015-01-0100:00:00.000'
----------------------------------------------------------------
/*SQL主體*/
----------------------------------------------------------------
declare@WeekHeadernvarchar(max)
select@WeekHeader=coalesce(@WeekHeader+',['+cast(WeekOfYearasvarchar)+']','['+cast(WeekOfYearasvarchar)+']')
from
(
selectWeekOfYearfromComn.CalendarwhereDatePerDay>=@FDateandDatePerDay<@EdategroupbyWeekOfYear
)M
declare@PivotSQLnvarchar(max)set@PivotSQL=N'
select
Yearas年份,'+@WeekHeader+'
from
(
select[Year],WeekOfYear,DatePerDayfrom[DT_WareHouse].[Comn].[Calendar]whereDatePerDay>=@FDateandDatePerDay<@Edate
)M
pivot
(
count(DatePerDay)for[WeekOfYear]in('+@WeekHeader+')
)PVT'
execsp_executesql@PivotSQL,N'@FDatedatetime,@Edatedatetime',@FDate,@Edate
執行結果:
8. sql server 列轉行問題
如果是寫程序,就按你的要求直接輸出就好了。
如果只是要數據,可以把查詢的結果復制到excel中,然後在excel中利用轉置(粘貼時的一個選擇項)的功能可以實現你的要求。
9. SQL SERVER 2008 復雜行轉列
創建表,數據
createtabletest
(合同編號varchar(10),
付款日期varchar(10),
付款金額int,
序號varchar(2))
insertintotestvalues('JNHS1501','2015-01-01',2600000,1)
insertintotestvalues('JNHS1501','2015-04-01',1000000,2)
insertintotestvalues('JNHS1501','2015-04-27',2000000,3)
insertintotestvalues('JNHS1501','2015-04-16',1500000,4)
insertintotestvalues('JNHS1501','2015-05-26',2000000,5)
insertintotestvalues('JNHS1501','2015-06-16',2000000,6)
insertintotestvalues('JNHS1501','2015-07-29',684770,7)
insertintotestvalues('JNHS1502','2015-05-05',180000,1)
insertintotestvalues('JNHS1502','2015-01-05',50000,2)
執行
declare@sqlvarchar(4000)
set@sql='select合同編號'
select@sql=@sql+',max(case序號when'''+[序號]+'''then[付款日期]end)as
付款日期'+序號+',max(case序號when'''+[序號]+'''then[付款金額]end)as
付款金額'+序號+''
from(selectdistinct序號fromtest)asa
select@sql=@sql+'fromtestgroupby合同編號'
exec(@sql)
結果:
10. SqlServer2008中,怎麼進行 行轉列
--除去第二行,要麼你直接delete,要麼給一個規則,去最大?最小?還是相加,自己處理一下
if OBJECT_ID('tb') is not null
drop table tb
go
create table tb (id int,AttachName int,AttachNum int,AttachReSerNum int,AttachSerNum int)
insert into tb
select 4,1,1,12313,123 union all
select 4,1,1,312313,123131 union all
select 5,2,1,1231231,123123
DECLARE @SQL VARCHAR(8000),@SQL1 VARCHAR(8000)
DECLARE @I INT,@COUNT INT,@COLUMN VARCHAR(20)
SELECT @SQL = ISNULL(@SQL + '],[' , '') + CONVERT(VARCHAR(10),ID) FROM tb GROUP BY ID
SET @SQL = '[' + @SQL + ']'
select @sql1=isnull(@sql1,'')+'SELECT '''+a.name+''' as 屬性,'+@sql+'
FROM (
SELECT ID,MIN('+a.name+') as '+a.name+'
FROM tb
group by ID
) A PIVOT (MAX('+a.name+') FOR ID IN (' + @SQL + ')) B union all
'
from sys.all_columns as a
where a.object_id=object_id('tb') and a.name!='ID'
set @SQL1=substring(@sql1,0,len(@sql1)-11)
exec(@sql1)
------------------------------------
屬性 4 5
-------------- ----------- -----------
AttachName 1 2
AttachNum 1 1
AttachReSerNum 12313 1231231
AttachSerNum 123 123123