1. 程式人生 > >多表查詢-行列轉換-合計SQL語句

多表查詢-行列轉換-合計SQL語句

create table 分類表(分類ID int , 分類名稱 varchar(10))
insert into 分類表 values(1 , '一類')
insert into 分類表 values(2 , '二類')
insert into 分類表 values(3 , '三類')
create table 物資表(物資ID int, 物資名稱 varchar(10), 物資單價 int, 分類ID int)
insert into 物資表 values(1 , '固化劑' , 20 , 2 )
insert into 物資表 values(2 , '塑料桶' , 10 , 1 )
insert into 物資表 values(3 , '加熱板' , 35 , 3 )
create table 部門表(部門ID int, 部門名稱 varchar(10))
insert into 部門表 values(1 , 'A部門')
insert into 部門表 values(2 , 'B部門')
insert into 部門表 values(3 , 'C部門')
create table 領用表(領用ID int, 領用日期 datetime, 物資ID int, 領用數量 int, 領用部門ID int)
insert into 領用表 values(1 , '2008-10-20', 2 , 20 , 1)
insert into 領用表 values(2 , '2008-11-2' , 1 , 30 , 3)
insert into 領用表 values(3 , '2008-11-25', 3 , 40 , 2)
insert into 領用表 values(4 , '2008-11-26', 2 , 50 , 3)
insert into 領用表 values(5 , '2008-11-27', 1 , 60 , 1)
insert into 領用表 values(6 , '2008-11-27', 3 , 60 , 1)
create table 計劃表(計劃ID int, 部門ID int, 月計劃金額 int, 計劃月份 datetime)
insert into 計劃表 values(1 , 1 , 2000 , '2008-10-1')
insert into 計劃表 values(2 , 2 , 1000 , '2008-10-1')
insert into 計劃表 values(3 , 3 , 3000 , '2008-10-1')
insert into 計劃表 values(7 , 1 , 2100 , '2008-11-1')
insert into 計劃表 values(8 , 2 , 1100 , '2008-11-1')
insert into 計劃表 values(9 , 3 , 3100 , '2008-11-1')

declare @sql varchar(4000)
set @sql='if (object_id(''temptd1'')) is not null
drop table temptd1 '
set @[email protected]+'
if object_id(''temptd2'') is not null
drop table temptd2 '
set @[email protected]+'
if object_id(''temptd3'') is not null
drop table temptd3 '
set @[email protected]+'
if object_id(''temptd4'') is not null
drop table temptd4 '
set @

[email protected]+'
select * into temptd1 from'
set @[email protected]+'
(select b.分類名稱'
select @[email protected]+',
max(case 部門名稱 when '''+部門名稱+''' then 消耗金額 else 0 end)'+'['+部門名稱+']'
from (select distinct 部門名稱 from 部門表) a
set @[email protected]+'
from (select 分類名稱,部門名稱,領用數量*物資單價 as 消耗金額
from 領用表,物資表,分類表,部門表
where 物資表.物資ID=領用表.物資ID
and 分類表.分類ID=物資表.分類ID
and 部門表.部門ID=領用表.領用部門ID) b group by b.分類名稱) 表1 '

set @[email protected]+'
select * into temptd2 from(select ''合計金額'' as 分類名稱'
select @[email protected]+',
sum('+部門名稱+') ['+部門名稱+']'
from(select distinct 部門名稱 from 部門表) a
set @[email protected]+' from temptd1) 表2 '

set @[email protected]+'
select * into temptd3 from(select ''計劃金額'' as 分類名稱'
select @[email protected]+',
sum(case 部門名稱 when '''+部門名稱+''' then 月計劃金額 else 0 end) ['+部門名稱+']'
from(select distinct 部門名稱 from 部門表) a
set @[email protected]+'
from 部門表,計劃表 where 計劃表.部門ID=部門表.部門ID) 表3 '

set @[email protected]+'
select * into temptd4 from(select ''差額'' as 分類名稱'
select @[email protected]+',
(temptd3.'+部門名稱+'-temptd2.'+部門名稱+') ['+部門名稱+']'
from(select distinct 部門名稱 from 部門表) a
set @[email protected]+' from temptd2,temptd3) 表4'
set @[email protected]+'

select * from temptd1
union all
(select * from temptd2)
union all
(select * from temptd3)
union all
(select * from temptd4)'
print @sql
exec(@sql)

--打印出來的SQL靜態語句
if (object_id('temptd1')) is not null
drop table temptd1
if object_id('temptd2') is not null
drop table temptd2
if object_id('temptd3') is not null
drop table temptd3
if object_id('temptd4') is not null
drop table temptd4
select * into temptd1 from
(select b.分類名稱,
max(case 部門名稱 when 'A部門' then 消耗金額 else 0 end)[A部門],
max(case 部門名稱 when 'B部門' then 消耗金額 else 0 end)[B部門],
max(case 部門名稱 when 'C部門' then 消耗金額 else 0 end)[C部門]
from (select 分類名稱,部門名稱,領用數量*物資單價 as 消耗金額
from 領用表,物資表,分類表,部門表
where 物資表.物資ID=領用表.物資ID
and 分類表.分類ID=物資表.分類ID
and 部門表.部門ID=領用表.領用部門ID) b group by b.分類名稱) 表1
select * into temptd2 from(select '合計金額' as 分類名稱,
sum(A部門) [A部門],
sum(B部門) [B部門],
sum(C部門) [C部門] from temptd1) 表2
select * into temptd3 from(select '計劃金額' as 分類名稱,
sum(case 部門名稱 when 'A部門' then 月計劃金額 else 0 end) [A部門],
sum(case 部門名稱 when 'B部門' then 月計劃金額 else 0 end) [B部門],
sum(case 部門名稱 when 'C部門' then 月計劃金額 else 0 end) [C部門]
from 部門表,計劃表 where 計劃表.部門ID=部門表.部門ID) 表3
select * into temptd4 from(select '差額' as 分類名稱,
(temptd3.A部門-temptd2.A部門) [A部門],
(temptd3.B部門-temptd2.B部門) [B部門],
(temptd3.C部門-temptd2.C部門) [C部門] from temptd2,temptd3) 表4

select * from temptd1
union all
(select * from temptd2)
union all
(select * from temptd3)
union all
(select * from temptd4)

(所影響的行數為 3 行)


(所影響的行數為 1 行)


(所影響的行數為 1 行)


(所影響的行數為 1 行)


--結果如下:
--分類名稱 A部門 B部門 C部門
--二類     1200  0    600
--三類     2100  1400 0
--一類     200   0    500
--合計金額 3500  1400 1100
--計劃金額 4100  2100 6100
--差額     600   700  5000


if (object_id('temptd1')) is not null
drop table temptd1
if object_id('temptd2') is not null
drop table temptd2
if object_id('temptd3') is not null
drop table temptd3
if object_id('temptd4') is not null
drop table temptd4
select * into temptd1 from
(select b.分類名稱,
max(case 部門名稱 when 'A部門' then 消耗金額 else 0 end)[A部門],
max(case 部門名稱 when 'B部門' then 消耗金額 else 0 end)[B部門],
max(case 部門名稱 when 'C部門' then 消耗金額 else 0 end)[C部門]
from (select 分類名稱,部門名稱,領用數量*物資單價 as 消耗金額
from 領用表,物資表,分類表,部門表
where 物資表.物資ID=領用表.物資ID
and 分類表.分類ID=物資表.分類ID
and 部門表.部門ID=領用表.領用部門ID) b group by b.分類名稱) 表1
select * into temptd2 from(select '合計金額' as 分類名稱,
sum(A部門) [A部門],
sum(B部門) [B部門],
sum(C部門) [C部門] from temptd1) 表2
select * into temptd3 from(select '計劃金額' as 分類名稱,
sum(case 部門名稱 when 'A部門' then 月計劃金額 else 0 end) [A部門],
sum(case 部門名稱 when 'B部門' then 月計劃金額 else 0 end) [B部門],
sum(case 部門名稱 when 'C部門' then 月計劃金額 else 0 end) [C部門]
from 部門表,計劃表 where 計劃表.部門ID=部門表.部門ID) 表3
select * into temptd4 from(select '差額' as 分類名稱,
(temptd3.A部門-temptd2.A部門) [A部門],
(temptd3.B部門-temptd2.B部門) [B部門],
(temptd3.C部門-temptd2.C部門) [C部門] from temptd2,temptd3) 表4

select * from temptd1
union all
(select * from temptd2)
union all
(select * from temptd3)
union all
(select * from temptd4)

相關推薦

查詢-行列轉換-合計SQL語句

create table 分類表(分類ID int , 分類名稱 varchar(10)) insert into 分類表 values(1 , '一類') insert into 分類表 values(2 , '二類') insert into 分類表 values(3 ,

mybatis逆向工程的Example類用法==筆記==【單操作只需呼叫,查詢需要自定義sql+mapper介面方法(待補全)】

======上程式碼: ===版本1: @Service public class BaseDictServiceImpl implements BaseDictService { //查詢資料字典表,注入資料字典表mapper介面代理物件 @Autowired

查詢sql語句

多表 join 返回 選擇 new change 合並 技術 ima 多表查詢sql語句 1 --解鎖SCOTT用戶 2 alter user scott account unlock 3 --檢索指定的列 4 select job,ename,empno fro

Sql語句查詢和更新

//多表查詢 select 表1.表1欄位, 表2.表2欄位 from 表1 inner join 表2 on 表1.Id=表2.Id //多表更新。讓A表的某欄位和B表的某欄位相同 update 表A set 表A.表A 欄位=表B.表B欄位 from 表B WHERE 表A

查詢sql語句(5

關聯表 多表查詢 HERE from join eal where sso sql語句 學生表student(id,name)老師表teacher(id,name)課程表lesson(id,name)老師和課程關聯表(id,teacher_id,lesson_id)學生和課

SQL查詢優化 高效率SQL語句 11條原則

)重點關注ORACLE的解析器按照從右到左的順序處理FROM子句中的表名,因此FROM子句中寫在最後的表(基礎表 driving table)將被最先處理. 在FROM子句中包含多個表的情況下,你必須選擇記錄條數最少的表作為基礎表.當ORACLE處理多個表時, 會運用排序及合併的方式連線它們.首先,掃描第一個

SQL語句查詢技巧 如何查詢

tip:聚合函式只能用在select或者having條件之後。 用limit取代子查詢 適用於查詢最大,最小值的情況。比如 查詢Score表中的最高分的學生學號和課程號。 可以先查出最高分的的分值然後再條件查詢 select sno, cno from sc

SQL Server 檢視快取中使用索引掃描、掃描、鍵查詢、隱式轉換SQL語句

表掃描和標檢查詢是最消耗效能的,還好就是SqlServer自動維護執行計劃將其儲存在記憶體中.而且動態檢視sys.dm_db_index_usage_stats也記錄相關資訊,這樣我們就可以再次分析執行計劃,從而找出進行優化 --總體檢視哪個資料庫掃描查詢次數最多 sel

專案收穫-查詢sql語句的拼接+反射

在專案中,涉及到了多表查詢,總共有6張表,在前端頁面中顯示的輸入框的又多,獲得的引數不一定是有值的,語句拼接非常麻煩。 在編寫專案程式碼的時候,我們已經給各個實體類寫好了一一對應的dao,為了拼接sql語句,我也寫好了單個物件拼接sql語句的工具方法。 在多表多條件查詢的

SQL語句面試題目:查詢SQL約束、DDL、DML

1 SQL語句多表查詢 例如:按照 department_id 查詢 employees(員工表)和 departments(部門表)的資訊。 方式一(通用型):SELECT ... FROM ... WHERE SELECT e.last_name,e.depart

SQL 語句查詢方式

例如:按照 department_id 查詢 employees(員工表)和 departments(部門表) 的資訊。 方式一(通用型):SELECT ... FROM ... WHERE SELECT e.last_name,e.department_id,d.department_name FROM e

關於查詢sql常用的連線語句:左外連線、右外連線、內連線

1)內聯接:    內聯接使用比較運算子(使用像 =  或 <> 之類的比較運算子)根據每個表共有的列的值匹配兩個表中的行,根據這兩張表中相同列的條件,得出其      交集。例如:  

SQL判斷語句用法和查詢

1.格式化時間sql語句   本例中本人隨便做了兩張表,和實際不是很相符,只是想說明sql語句的寫法。   例1表格式如下:      需求:查詢出本表,但需要使time欄位的時間格式為yyyy-MM-dd,比如:2013-08-13   sql寫法:   S

sql語句查詢(學生/課程表/教師/成績 )

問題及描述: --1.學生表 Student(S#,Sname,Sage,Ssex) --S# 學生編號,Sname 學生姓名,Sage 出生年月,Ssex 學生性別 --2.課程表 Course(C#,Cname,T#) --C# --課程編號,Cname 課程名稱,T# 教師編號 --3.教師表 Te

SQL學習筆記_04_查詢

table cross fff 集中 數據 out clas -s 返回 一.概念: 1.多表連接有以下幾種分法: (1)內連接 vs 外連接 (左、右、滿)

spring boot 學習心得 使用JpaRepository註解自定義SQL查詢數據庫查詢

自定義 net http entity onetomany tom pri 查詢語句 重點 一. 首先在@Entity註解的類裏面要寫好外鍵關系. 這個 @ManyToOne 註解可以建立外鍵關系, 不要在自己傻傻的寫一個 private int grades_id;

sql-查詢JOIN與分組GROUP BY

group 邊表 AS inner left join sdn AR full join ner 一、內部連接:兩個表的關系是平等的,可以從兩個表中獲取數據。用ON表示連接條件 SELECT A.a,B.b FROM At AS A INNER JOINT Bt AS B

ORACLE----查詢語句練習

sco tag lead num creat cor 多表數據查詢 pda 查詢 一.建表 1.建立兩張表CLASSINFO,STUDENTINFO. --建表CLASSINFO;CREATE TABLE CLASSINFO ( CLASSID NUMBER(2) P

sql 查詢結果驗證

插入數據 create reat sql語句 ont creat 卡爾 nbsp 總結 1.笛卡爾積 定義: 設A,B為集合,用A中元素為第一元素,B中元素為第二元素構成的有序對,所有這樣的有序對組成的集合 ,叫做A與B的笛卡爾積,記作AxB. 上面有一個很關鍵的詞為“有序

Java框架-mybatis連線池、動態sql查詢

1. mybatis連線池 通過SqlMapConfig.xml設定dataSource type實現連線池的配置 1.1 dataSource標籤type屬性值含義 type=”POOLED”: MyBatis 會建立 PooledDataSource 例項