❶ 寫sql,怎麼將查詢結果的行列轉換呀
有意思的問題 給出一個參考的URL: 假設你表是這樣的結構部件 入庫日期 入庫數量 A 1/1 10 A 1/1 5 A 1/2 10 B 1/5 10 其實就是兩種方法,假設你的資料庫是11以前的,只能先定義好查哪天到哪天 然後那麼 selct 部件, sum( decode(入庫日期=1號,入庫數量,0), sum( decode(入庫日期=2號,入庫數量,0), 以此類推 from 入庫表 group BY 部件(原理上就是將不是這天的變成0,再合計)要是Oracle資料庫是11的話,就簡單了,直接pivot搞定 pivot語法就不說了,網上一堆一堆的 ~
❷ 行轉列,列轉行怎麼做sql
/*行轉列*/
SELECT*FROM[StudentScores]/*數據源*/ASP
PIVOT
(SUM(Score/*行轉列後列的值*/)FOR
p.Subject/*需要行轉列的列*/IN([語文],[數學],[英語],[生物]/*列的值*/)
)AST
/*列轉行*/
SELECTP.ProgrectName,P.Supplier,P.SupplyNumFROM(SELECTProgrectName,OverseaSupply,NativeSupply,
SouthSupply,NorthSupplyFROMProgrectDetail
)T
UNPIVOT
(
SupplyNumFORSupplierIN
(OverseaSupply,NativeSupply,SouthSupply,NorthSupply)
)P
❸ 如何用SQL語句交換一張表的行和列
設 A --源表, B-- 目標表
列轉行: A有幾個欄位,B就有幾條記錄
行轉列: A有幾個記錄,B就有幾個欄位
所以,前提條件是A表是固定的,才好操作。不然可就不好實現了。
更細致的操作就不跟這里寫了。
❹ sql語句行轉列 怎麼轉啊
--聲明變數
declare@sqlvarchar(1000),@num_dataint,@num_allvarchar(2000),@num_numint,@table_sqlvarchar(2000)
set@num_num=0
--判斷並創建表
ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[records]')andOBJECTPROPERTY(id,N'IsUserTable')=1)
droptable[dbo].[records]
createtablerecords(
[id]int,
[name]varchar(50),
[sex]varchar(10),
[num]int
)
--插入數據
insertintorecordsvalues(1,'tom','男',2)
insertintorecordsvalues(1,'tom','男',3)
insertintorecordsvalues(1,'tom','男',4)
insertintorecordsvalues(1,'tom','男',5)
--全選表中數據
select*fromrecords
--全選num列數據
selectnumas'數據'fromrecords
--釋放游標
deallocateselect_num
--為『selectnumfromrecords』建立游標
declareselect_numscrollcursorforselectnumas'shuju'fromrecords
--打開游標
openselect_num
--獲得第一條數據
fetchnextfromselect_numinto@num_data
set@num_all=convert(varchar,@num_data)+','
set@num_num=@num_num+1;
--如果獲取成功,繼續獲得數據
while@@fetch_status=0
begin
fetchnextfromselect_numinto@num_data
set@num_num=@num_num+1;
set@num_all=@num_all+convert(varchar,@num_data)+','
end
--關閉游標
closeselect_num
print@num_num
--set@num_num=@num_num-1;
declare@iint
set@i=1
print@num_num
print@i
set@table_sql='createtablenumall(idint,namevarchar(50),sexvarchar(10)'
print@table_sql
while@num_num>=1
begin
set@table_sql=@table_sql+',num'+convert(varchar,@i)+'int'
set@num_num=@num_num-1;
set@i=@i+1
end
set@table_sql=@table_sql+')'
print@table_sql
ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[numall]')andOBJECTPROPERTY(id,N'IsUserTable')=1)
droptable[dbo].[numall]
exec(@table_sql)
declare@insert_sqlvarchar(2000)
set@insert_sql='insertintonumallvalues(1,'+'''tom'','+'''男'''
print@insert_sql
openselect_num
--獲得第一條數據
fetchnextfromselect_numinto@num_data
set@insert_sql=@insert_sql+','+convert(varchar,@num_data)
--如果獲取成功,繼續獲得數據
while@@fetch_status=0
begin
fetchnextfromselect_numinto@num_data
set@insert_sql=@insert_sql+','+convert(varchar,@num_data)
end
set@insert_sql=@insert_sql+')'
print@insert_sql
exec(@insert_sql)
--insertintonumallvalues(1,'tom','男',2,3,4,5,5)
select*fromnumall
試試吧,數據雖然有點出入,但已經說明問題了!!!
❺ sql2008將所有行和列對調,代碼如何寫
使用case when語句和group by
❻ 如何用SQL把下面兩個表完全倒過來,行變列,列變行完全轉置!
靜態腳本:
select '收入' as 項目
, case when 項目='一廠本月' then 收入 else null end as 一廠本月
, case when 項目='一廠本年' then 收入 else null end as 一廠本年
, case when 項目='二廠本月' then 收入 else null end as 二廠本月
, case when 項目='二廠本年' then 收入 else null end as 二廠本年
, case when 項目='三廠本月' then 收入 else null end as 三廠本月
, case when 項目='三廠本年' then 收入 else null end as 三廠本年
from 表名
union all
select '成本' as 項目
, case when 項目='一廠本月' then 成本 else null end as 一廠本月
, case when 項目='一廠本年' then 成本 else null end as 一廠本年
, case when 項目='二廠本月' then 成本 else null end as 二廠本月
, case when 項目='二廠本年' then 成本 else null end as 二廠本年
, case when 項目='三廠本月' then 成本 else null end as 三廠本月
, case when 項目='三廠本年' then 成本 else null end as 三廠本年
from 表名
union all
select '其他費用' as 項目
, case when 項目='一廠本月' then 其他費用 else null end as 一廠本月
, case when 項目='一廠本年' then 其他費用 else null end as 一廠本年
, case when 項目='二廠本月' then 其他費用 else null end as 二廠本月
, case when 項目='二廠本年' then 其他費用 else null end as 二廠本年
, case when 項目='三廠本月' then 其他費用 else null end as 三廠本月
, case when 項目='三廠本年' then 其他費用 else null end as 三廠本年
from 表名
union all
select '毛利' as 項目
, case when 項目='一廠本月' then 毛利 else null end as 一廠本月
, case when 項目='一廠本年' then 毛利 else null end as 一廠本年
, case when 項目='二廠本月' then 毛利 else null end as 二廠本月
, case when 項目='二廠本年' then 毛利 else null end as 二廠本年
, case when 項目='三廠本月' then 毛利 else null end as 三廠本月
, case when 項目='三廠本年' then 毛利 else null end as 三廠本年
from 表名
改動態腳本(只改項目,即改原錶行不定,列數目固定):
declare @sql nvarchar(max)
set @sql=''
set @sql=@sql+'
select ''收入'' as 項目
'
select @sql=@sql+', case when 項目='''+項目+''' then 收入 else null end as '+項目
from 表名
set @sql=@sql+'
from 表名
'
set @sql=@sql+'union all
select ''成本'' as 項目
'
select @sql=@sql+', case when 項目='''+項目+''' then 成本 else null end as '+項目
from 表名
set @sql=@sql+'
from 表名
'
set @sql=@sql+'union all
select ''其他費用'' as 項目
'
select @sql=@sql+', case when 項目='''+項目+''' then 其他費用 else null end as '+項目
from 表名
set @sql=@sql+'
from 表名
'
set @sql=@sql+'union all
select ''毛利'' as 項目
'
select @sql=@sql+', case when 項目='''+項目+''' then 毛利 else null end as '+項目
from 表名
set @sql=@sql+'
from 表名
'
exec sp_executesql @sql
改動態腳本(改原錶行和列數目不固定,兩層動態腳本,能實現但基本難讀):
declare @sql nvarchar(max)
set @sql='declare @sql_in nvarchar(max)
set @sql_in='' '' '
set @sql=@sql+'select @sql_in=@sql_in+''union all
select ''''''+name+'''''' as 項目
'
select @sql=@sql+', case when 項目='''''+項目+''''' then ''+name+'' else null end as '+項目
from 表名
set @sql=@sql+'
from 表名
''
from syscolumns where id=(select id from sysobjects where name=''表名'')
order by colorder
set @sql_in=stuff(@sql_in,1,10,'''')
exec sp_executesql @sql_in
'
exec sp_executesql @sql
❼ 哪位大俠會用SQL寫行列轉置的語句,謝謝了
總結一下關於行列轉置的實現方法
1、固定列數的行列轉換
如
student subject grade
--------- ---------- --------
student1 語文 80
student1 數學 70
student1 英語 60
student2 語文 90
student2 數學 80
student2 英語 100
……
轉換為
語文 數學 英語
student1 80 70 60
student2 90 80 100
……
語句如下:select student,
sum(decode(subject,'語文', grade,null)) "語文",
sum(decode(subject,'數學', grade,null)) "數學",
sum(decode(subject,'英語', grade,null)) "英語"
from table
group by student;
2、不定列行列轉換
如
c1 c2
--- -----------
1 我
1 是
1 誰
2 知
2 道
3 不
……
轉換為
1 我是誰
2 知道
3 不
這一類型的轉換可以藉助於PL/SQL來完成,這里給一個例子
CREATE OR REPLACE FUNCTION get_c2(tmp_c1 NUMBER)
RETURN VARCHAR2
IS
Col_c2 VARCHAR2(4000);
BEGIN
FOR cur IN (SELECT c2 FROM t WHERE c1=tmp_c1) LOOP
Col_c2 := Col_c2||cur.c2;
END LOOP;
Col_c2 := rtrim(Col_c2,1);
RETURN Col_c2;
END;
select distinct c1 ,get_c2(c1) cc2 from table;
或者不用pl/sql,利用分析函數和 CONNECT_BY 實現:
SELECT c1, SUBSTR (MAX (SYS_CONNECT_BY_PATH (c2, ';')), 2) NAME
FROM (SELECT c1, c2, rn, LEAD (rn) OVER (PARTITION BY c1 ORDER BY rn) rn1
FROM (SELECT c1, c2, ROW_NUMBER () OVER (ORDER BY c2) rn
FROM t))
START WITH rn1 IS NULL
CONNECT BY rn1 = PRIOR rn
GROUP BY c1;
3、列數不固定(交叉錶行列轉置)
這種是比較麻煩的一種,需要藉助pl/sql:
原始數據:
CLASS1 CALLDATE CALLCOUNT
1 2005-08-08 40
1 2005-08-07 6
2 2005-08-08 77
3 2005-08-09 33
3 2005-08-08 9
3 2005-08-07 21
轉置後:
CALLDATE CallCount1 CallCount2 CallCount3
------------ ---------- ---------- ----------
2005-08-09 0 0 33
2005-08-08 40 77 9
2005-08-07 6 0 21
試驗如下:
1). 建立測試表和數據
CREATE TABLE t(
class1 VARCHAR2(2 BYTE),
calldate DATE,
callcount INTEGER
);
INSERT INTO t(class1, calldate, callcount)
VALUES ('1', TO_DATE ('08/08/2005', 'MM/DD/YYYY'), 40);
INSERT INTO t(class1, calldate, callcount)
VALUES ('1', TO_DATE ('08/07/2005', 'MM/DD/YYYY'), 6);
INSERT INTO t(class1, calldate, callcount)
VALUES ('2', TO_DATE ('08/08/2005', 'MM/DD/YYYY'), 77);
INSERT INTO t(class1, calldate, callcount)
VALUES ('3', TO_DATE ('08/09/2005', 'MM/DD/YYYY'), 33);
INSERT INTO t(class1, calldate, callcount)
VALUES ('3', TO_DATE ('08/08/2005', 'MM/DD/YYYY'), 9);
INSERT INTO t(class1, calldate, callcount)
VALUES ('3', TO_DATE ('08/07/2005', 'MM/DD/YYYY'), 21);
COMMIT ;
2). 建立ref cursor准備輸出結果集
CREATE OR REPLACE PACKAGE pkg_getrecord
IS
TYPE myrctype IS REF CURSOR;
END pkg_getrecord;
/
3). 建立動態sql交叉表函數,輸出結果集
CREATE OR REPLACE FUNCTION fn_rs
RETURN pkg_getrecord.myrctype
IS
s VARCHAR2 (4000);
CURSOR c1 IS
SELECT ',sum(case when Class1='
|| class1
|| ' then CallCount else 0 end)'
|| ' "CallCount'
|| class1
|| '"' c2
FROM t
GROUP BY class1;
r1 c1%ROWTYPE;
list_cursor pkg_getrecord.myrctype;
BEGIN
s := 'select CallDate ';
OPEN c1;
LOOP
FETCH c1 INTO r1;
EXIT WHEN c1%NOTFOUND;
s := s || r1.c2;
END LOOP;
CLOSE c1;
s := s || ' from T group by CallDate order by CallDate desc ';
OPEN list_cursor FOR s;
RETURN list_cursor;
END fn_rs;
/
4). 測試在sql plus下執行:
var results refcursor;
exec :results := fn_rs;
print results;
CALLDATE CallCount1 CallCount2 CallCount3
--------------- ---------- ---------- ----------
2005-08-09 0 0 33
2005-08-08 40 77 9
2005-08-07 6 0 21
❽ SQL中行轉列問題。。。先是列轉行,後來我想在倒回去,怎麼寫
行轉列, 使用 CASE WHEN 處理。
http://hi..com/wangqing999/blog/item/fc7a29164f46c2c1c2fd785c.html
列轉行, 使用 UNION ALL 處理。
http://hi..com/wangqing999/blog/item/4b75aa2dfe5b63f198250a49.html
❾ SQL 如何讓資料庫數據以倒序輸出
通過 」order by「實現,語法 :order by 欄位 asc/desc。
sql:select * from tablename order by filename1 desc;
解釋:上面語句的意思就是根據」filename1欄位「排序,倒敘輸出tablename表中的數據。
備註:asc是表示升序,desc表示降序。