當前位置:首頁 » 數據倉庫 » 資料庫機構轉橫向
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

資料庫機構轉橫向

發布時間: 2022-08-28 15:32:21

sql中怎麼讓結果集橫向顯示

給你一個最長見的例子:普通行列轉換
問題:假設有張學生成績表(tb)如下:
姓名 課程 分數
張三 語文 74
張三 數學 83
張三 物理 93
李四 語文 74
李四 數學 84
李四 物理 94
想變成(得到如下結果):
姓名 語文 數學 物理
---- ---- ---- ----
李四 74 84 94
張三 74 83 93
-------------------
*/

create table tb(姓名 varchar(10) , 課程 varchar(10) , 分數 int)
insert into tb values('張三' , '語文' , 74)
insert into tb values('張三' , '數學' , 83)
insert into tb values('張三' , '物理' , 93)
insert into tb values('李四' , '語文' , 74)
insert into tb values('李四' , '數學' , 84)
insert into tb values('李四' , '物理' , 94)
go

--SQL SERVER 2000 靜態SQL,指課程只有語文、數學、物理這三門課程。(以下同)
select 姓名 as 姓名 ,
max(case 課程 when '語文' then 分數 else 0 end) 語文,
max(case 課程 when '數學' then 分數 else 0 end) 數學,
max(case 課程 when '物理' then 分數 else 0 end) 物理
from tb
group by 姓名

--SQL SERVER 2000 動態SQL,指課程不止語文、數學、物理這三門課程。(以下同)
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 課程 when ''' + 課程 + ''' then 分數 else 0 end) [' + 課程 + ']'
from (select distinct 課程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql)

--SQL SERVER 2005 靜態SQL。
select * from (select * from tb) a pivot (max(分數) for 課程 in (語文,數學,物理)) b

--SQL SERVER 2005 動態SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + 課程 from tb group by 課程
exec ('select * from (select * from tb) a pivot (max(分數) for 課程 in (' + @sql + ')) b')

---------------------------------

/*
問題:在上述結果的基礎上加平均分,總分,得到如下結果:
姓名 語文 數學 物理 平均分 總分
---- ---- ---- ---- ------ ----
李四 74 84 94 84.00 252
張三 74 83 93 83.33 250
*/

--SQL SERVER 2000 靜態SQL。
select 姓名 姓名,
max(case 課程 when '語文' then 分數 else 0 end) 語文,
max(case 課程 when '數學' then 分數 else 0 end) 數學,
max(case 課程 when '物理' then 分數 else 0 end) 物理,
cast(avg(分數*1.0) as decimal(18,2)) 平均分,
sum(分數) 總分
from tb
group by 姓名

--SQL SERVER 2000 動態SQL。
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 課程 when ''' + 課程 + ''' then 分數 else 0 end) [' + 課程 + ']'
from (select distinct 課程 from tb) as a
set @sql = @sql + ' , cast(avg(分數*1.0) as decimal(18,2)) 平均分 , sum(分數) 總分 from tb group by 姓名'
exec(@sql)

--SQL SERVER 2005 靜態SQL。
select m.* , n.平均分 , n.總分 from
(select * from (select * from tb) a pivot (max(分數) for 課程 in (語文,數學,物理)) b) m,
(select 姓名 , cast(avg(分數*1.0) as decimal(18,2)) 平均分 , sum(分數) 總分 from tb group by 姓名) n
where m.姓名 = n.姓名

--SQL SERVER 2005 動態SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + 課程 from tb group by 課程
exec ('select m.* , n.平均分 , n.總分 from
(select * from (select * from tb) a pivot (max(分數) for 課程 in (' + @sql + ')) b) m ,
(select 姓名 , cast(avg(分數*1.0) as decimal(18,2)) 平均分 , sum(分數) 總分 from tb group by 姓名) n
where m.姓名 = n.姓名')

drop table tb

------------------
------------------

/*
問題:如果上述兩表互相換一下:即表結構和數據為:
姓名 語文 數學 物理
張三 748393
李四 748494
想變成(得到如下結果):
姓名 課程 分數
---- ---- ----
李四 語文 74
李四 數學 84
李四 物理 94
張三 語文 74
張三 數學 83
張三 物理 93
--------------
*/

create table tb(姓名 varchar(10) , 語文 int , 數學 int , 物理 int)
insert into tb values('張三',74,83,93)
insert into tb values('李四',74,84,94)
go

--SQL SERVER 2000 靜態SQL。
select * from
(
select 姓名 , 課程 = '語文' , 分數 = 語文 from tb
union all
select 姓名 , 課程 = '數學' , 分數 = 數學 from tb
union all
select 姓名 , 課程 = '物理' , 分數 = 物理 from tb
) t
order by 姓名 , case 課程 when '語文' then 1 when '數學' then 2 when '物理' then 3 end

--SQL SERVER 2000 動態SQL。
--調用系統表動態生態。
declare @sql varchar(8000)
select @sql = isnull(@sql + ' union all ' , '' ) + ' select 姓名 , [課程] = ' + quotename(Name , '''') + ' , [分數] = ' + quotename(Name) + ' from tb'
from syscolumns
where name! = N'姓名' and ID = object_id('tb') --表名tb,不包含列名為姓名的其它列
order by colid asc
exec(@sql + ' order by 姓名 ')

--SQL SERVER 2005 動態SQL。
select 姓名 , 課程 , 分數 from tb unpivot (分數 for 課程 in([語文] , [數學] , [物理])) t

--SQL SERVER 2005 動態SQL,同SQL SERVER 2000 動態SQL。

--------------------
/*
問題:在上述的結果上加個平均分,總分,得到如下結果:
姓名 課程 分數
---- ------ ------
李四 語文 74.00
李四 數學 84.00
李四 物理 94.00
李四 平均分 84.00
李四 總分 252.00
張三 語文 74.00
張三 數學 83.00
張三 物理 93.00
張三 平均分 83.33
張三 總分 250.00
------------------
*/

select * from
(
select 姓名 as 姓名 , 課程 = '語文' , 分數 = 語文 from tb
union all
select 姓名 as 姓名 , 課程 = '數學' , 分數 = 數學 from tb
union all
select 姓名 as 姓名 , 課程 = '物理' , 分數 = 物理 from tb
union all
select 姓名 as 姓名 , 課程 = '平均分' , 分數 = cast((語文 + 數學 + 物理)*1.0/3 as decimal(18,2)) from tb
union all
select 姓名 as 姓名 , 課程 = '總分' , 分數 = 語文 + 數學 + 物理 from tb
) t
order by 姓名 , case 課程 when '語文' then 1 when '數學' then 2 when '物理' then 3 when '平均分' then 4 when '總分' then 5 end

drop table tb

Ⅱ 如何將資料庫里一列數據以橫向表的方式輸出

<table border="1">
<tr>
<td>data</td>
<% do while NOT rs.eof%>
respones.write"<td>" & rs("data") & "</td>"
rs.MoveNext
loop

rs.close
rs=nothing
conn.close
conn=nothing
%>
</tr>
</table>

Ⅲ 資料庫中如何將查詢出的數據轉換成橫過來的數據

你說的行列轉換吧,可以參考:

行列轉換等經典SQL語句
1.--行列轉換

原表: 姓名 科目 成績
張三 語文 80
張三 數學 90
張三 物理 85
李四 語文 85
李四 物理 82
李四 英語 90
李四 政治 70
王五 英語 90

轉換後的表: 姓名 數學 物理 英語 語文 政治
李四 0 82 90 85 70
王五 0 0 90 0 0
張三 90 85 0 80 0

實例:
create table cj --創建表cj
(
ID Int IDENTITY (1,1) not null, --創建列ID,並且每次新增一條記錄就會加1
Name Varchar(50),
Subject Varchar(50),
Result Int,
primary key (ID) --定義ID為表cj的主鍵
);
--Truncate table cj
--Select * from cj
Insert into cj
Select '張三','語文',80 union all
Select '張三','數學',90 union all
Select '張三','物理',85 union all
Select '李四','語文',85 union all
Select '李四','物理',82 union all
Select '李四','英語',90 union all
Select '李四','政治',70 union all
Select '王五','英語',90
--行列轉換
Declare @sql varchar(8000)
Set @sql = 'Select Name as 姓名'
Select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result else 0 end) ['+Subject+']'
from (select distinct Subject from cj) as cj --把所有唯一的科目的名稱都列舉出來
Select @sql = @sql+' from cj group by name'
Exec (@sql)

2. 行列轉換--合並
原表: 班級 學號
1 1
1 2
1 3
2 1
2 2
3 1
轉換後的表: 班級 學號
1 1,2,3
2 1,2
3 1

實例:
Create table ClassNo --創建表ClassNo
(
ID Int IDENTITY(1,1) not null, --創建列ID,並且每次新增一條記錄就會加1
Class Varchar(50), --班級列
Number Varchar(50), --學號列
Primary Key(ID) --定義ID為表ClassNo的主鍵
);
--Truncate Table ClassNo
--Select * from ClassNo
Insert Into ClassNo
Select 1,1 Union all
Select 1,2 Union all
Select 1,3 Union all
Select 2,1 Union all
Select 2,2 Union all
Select 3,1

創建一個合並的函數
--Drop Function KFReturn
Create Function KFReturn(@Class Varchar(50))
Returns Varchar(8000)
as
Begin
Declare @str Varchar(8000)
Set @str = ''
Select @str = @str + cast(Number as Varchar(50)) + ',' from ClassNo Where Class = @Class
Set @str = SubString(@str,1,len(@str)-1)
Return(@str)
End

--調用自定義函數得到結果
Select Distinct Class,dbo.KFReturn(Class) From ClassNo

3:列轉行
--Drop Table ColumnToRow
Create table ColumnToRow
(
ID Int IDENTITY(1,1) not null, --創建列ID,並且每次新增一條記錄就會加1
a int,
b int,
c int,
d int,
e int,
f int,
g int,
h int,
Primary Key(ID) --定義ID為表ColumnToRow的主鍵
);
--Truncate Table ColumnToRow
--Select * from ColumnToRow
Insert Into ColumnToRow
Select 15,9,1,0,1,2,4,2 Union all
Select 22,34,44,5,6,7,8,7 Union all
Select 33,44,55,66,77,88,99,12

Declare @sql Varchar(8000)
Set @sql = ''
Select @sql = @sql + rtrim(name) + ' from ColumnToRow union all Select ' from SysColumns Where id = object_id('ColumnToRow')
Set @sql = SubString(@sql,1,len(@sql)-70)
--70的長度就是這個字元串'from ColumnToRow union all Select ID from ColumnToRow union all Select ',因為它會把ID這一列的值也算進去,所以要把它截掉
Exec ('Select ' + @sql + ' from ColumnToRow')

Ⅳ 資料庫縱表變橫表會不會影響性能

橫表就是普通的建表方式,如一個表結構為:主鍵、欄位1、欄位2、欄位3。。。 如果變成縱表後,則表結構為: 主鍵、欄位代碼、欄位值。而欄位代碼則為欄位1、欄位2、欄位3。 具體為電信行業的例子。以用戶帳單表為例一般出賬時用戶有很多費用客戶,其數據一般存儲為:時間,客戶ID,費用科目,費用。這種存儲結構一般稱為縱表,其特點是行數多,欄位少。縱表在使用時由於行數多,統計用戶數或對用戶進行分檔時還需要進行GROUP BY 操作,性能低,且操作不便,為提高性能,通常根據需要將縱表進行匯總,形成橫表,比如:時間、客戶ID,基本通話費、漫遊通話費,國內長途費、國際長途費....。通常形成一個客戶一行的表,這種表統計用戶數或做分檔統計時比較方便。另外,數據挖掘時用到的寬表一般也要求是橫表結構。縱表對從資料庫到內存的映射效率是有影響的,但細一點說也要一分為二:縱表的初始映射要慢一些;縱表的變更的映射可能要快一些,如果只是改變了單個欄位時,畢竟橫表欄位比縱表要多很多

Ⅳ 如何對SQL Server資料庫進行橫向擴展

一般人們會選擇縱向擴展(scale up)SQL Server資料庫,而非橫向擴展(scale out)。縱向擴展很容易:增加硬體、處理能力、內存、磁碟和提高網路速度。其原理就是仍然在一台伺服器上運行資料庫,但是增加了伺服器的處理能力和資源。這種方法很昂貴,但是非常簡單直接。
採用雲技術
有時候,最簡單的方法就是將問題交由其他人處理。微軟的Windows Azure雲服務包含一個基於雲的SQL Server版本SQL Azure.這在技術上並非真正意義的橫向擴展,因為它是一種無限縱向擴展方法。所以,轉移到Azure並不需要對您的應用程序進行大改動。實際上,您只需要將應用程序遷移到SQL Azure,然後支付存儲、處理和數據傳輸費用。這些都是收費服務,但是您不需要再擔心擴展問題。
復制
SQL Server原生復制是一種支持橫向擴展的解決方案,與資料庫的創建和使用方式有關。您只需要在多台伺服器上復制多個資料庫副本,然後將不同的用戶指向各台伺服器。這種方法通常最適合支持地理位置分散的用戶,如亞洲辦公室的用戶使用伺服器1,而北美辦公室的用戶則使用伺服器2.每一台伺服器都擁有完整的數據副本,並且會復制夥伴伺服器的所有修改。
這種方法不支持自動負載均衡,並且最適合用在用戶固定只使用一部分數據的情況。換而言之,如果亞洲用戶只需要編輯與他們辦公室相關的數據--例如,主要是亞洲客戶的信息,那麼復制能夠保證其他資料庫副本也包含這些記錄的副本。如果所有用戶都需要編輯完整的數據集,那麼復制就變得有一些復雜,因為SQL Server必須在支持用戶的同時,編輯位於不同伺服器的同一個數據。
SQL Server的合並復制能夠處理這種沖突,但是您必須進行一些自定義合並編程,這意味著您的開發人員必須開發一些演算法,確定用戶並發訪問數據時誰獲取編輯許可權。客戶應用程序也需要增加編程;使它們不僅向資料庫提交數據修改,也要循環檢查這些修改是否被其他並發用戶重寫。用戶也需要重新培訓,因為客戶端應用程序可能會提示:"您正在編程的數據已經發生變化。您需要重新檢查,確定您的編輯是否仍然有效。"
聯合資料庫
另一個重要的橫向擴展方法是聯合。通過這種方法,您可以將資料庫劃分到多台伺服器上。垂直分割將同一個表的不同行保存到不同的伺服器上。同時,地理分區是最常用的方法:將所有亞洲數據記錄保存在一台伺服器上,而所有歐洲數據則保存在另一台伺服器上。這種方法不同於整體復制:每一個位置的伺服器都不具備完整的資料庫,而只擁有該位置的數據。通過實現一種SQL Server分布式分區視圖而形成完整的表,用戶就可以瀏覽一個"聯合"或組合的數據視圖。水平分割則將表的欄位保存在不同的伺服器上,因此各台伺服器一起協作構成組合的表。
這些資料庫的創建並不簡單,其中涉及一種整體操作。您需要掌握關於數據訪問和使用的詳細信息,才能夠實現正確的部署。此外,您還需要一位SQL Server資料庫架構師,他應該全面理解這些技術,分析您的業務情況,並且能夠正確地創建這些組件。
在一些情況中,實現這種橫向擴展對客戶端應用程序的改動很小。對於本身在設計上大量使用視圖和存儲過程進行數據訪問的應用程序,更是如此。因為這些元素只是是在後台抽象,在客戶端上不會發生變化。但是,這些應用程序並不常見;通常,實現橫向擴展都需要修改客戶端程序,使客戶端與後台結構分離。
橫向擴展並不簡單
毫無疑問,實現SQL Server橫向擴展非常復雜--這也是Azure等雲資料庫系統流行的原因之一。此外,有一些第三方供應商能夠幫助實現橫向擴展技術,而不需要完全依賴SQL Server的原生特性。您需要自己下功夫了解這些方法,理解數據訪問和使用方法,這樣才能夠選擇最符合您要求的方法。

Ⅵ Mysql中查詢(資料庫中的)縱向轉(查詢結果顯示為)橫向.

1、在mysql環境,創建資料庫表,

create table test_data1(id int, name VARCHAR(20), day VARCHAR(20))

Ⅶ oracle 資料庫sql高手來看看,如何縱向轉橫向

假設表有A,B兩列,代碼如下

selectA,LISTAGG(B,',')WITHINGROUP(ORDERBYB)BfromtablegroupbyA

上面SQL文可將B列橫向輸出,以逗號分割,輸出順序按B的值升序排列

Ⅷ oracle縱表轉橫表

一般行列轉置,有兩種做法
一種是case,但是由於case需要提前知道列數,所以在很多情況下不能滿足
所以出現了動態語句case,通過動態SQL語句的組裝,實現了動態的列的拼裝。但是語句復雜度很高

所以另一種方式就是靠程序轉置,使用一些Hash(JAVA)或Dictionary(C#)等一些對象,可以在程序中輕松地做出轉置,但是也有缺點,缺點就是開銷大,原本只處理一次的數據(只在資料庫處理),現在需要處理兩次(資料庫一次,程序一次)

Ⅸ php如何把資料庫的數據橫排顯示

創建表:

CREATE TABLE `DBTEST` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR( 50 ) ,
`sex` VARCHAR( 10 ) ,
PRIMARY KEY ( `id` )
);

以下主要是看樣式,自己調節樣式內的width 大小,想一行顯示多少都可以。
至於分頁什麼的,都是在sql語句那加個 limit 0, 20 ; 再加個分頁顯示函數。
(其實這只是一般應用的方法,我自己是用模板來解決的,考慮到樓主可能沒用過模板,
所以在此只說明思路,俱體的內容,就由樓主自己去做了)

----code 存為php文件-----------------------------------------------
<style type="text/css">
<!--
.pre_view {
float:left;
margin:4px;
width:50px;
height:60px;
text-align:center;
border:#999999 solid 1px;
}
-->
</style>
<?php
include("include/db_mysql.php");

$db = new db_test();

$query = "select * from DBTEST";
$query = $db->query($query);

while($dbq_rec = $db->fetch_array($query)){
$t1 = $dbq_rec['name'];
$t2 = $dbq_rec['sex'];
?>
<div class="pre_view">
<table width="50">
<tr><td><?=$t1;?></td></tr>
<tr><td><?=$t2;?></td></tr>
</table>
</div>
<?php
}
?>

--------- code ----------------------------------------

Ⅹ 資料庫縱向數據如何轉成橫向數據

SELECTt1.姓名,t1.分數ASID號01分數,t2.分數ASid號02分數
FROMTable1t1INNERJOIN
Table1t2ONt1.姓名=t2.姓名
WHERE(t1.ID號='01')AND(t2.ID號='02')