當前位置:首頁 » 編程語言 » sqlserver2008列轉行
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

sqlserver2008列轉行

發布時間: 2022-07-26 04:01:31

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