SQLServer 行轉列,統計,二次分組

2022-03-09 06:27:47 字數 1597 閱讀 7049

create table test

( bizdate datetime, --日期

classes varchar(50), --班次 '白班' 或 '夜班'

qty int --產量

) insert into test 

select '2011-04-01','白班',154 union

select '2011-04-01','白班',400 union

select '2011-04-02','夜班',40 union

select '2011-04-02','白班',150 union

select '2011-04-03','夜班',130 union

select '2011-04-03','白班',400 union

select '2011-04-04','白班',520 union

select '2011-04-04','白班',1000 union

select '2011-04-04','白班',240 

ps.日產量指每天的產量,包括白班和晚班

要統計成如下格式(日期唯一):

日期   白班總產量   夜班總產量   日產量

之前的寫法是:

select  bizdate,

case when classes='白班' then sum(qty) else 0 end as '白班產量',

case when classes='夜班' then sum(qty) else 0 end as '夜班產量'

from #test

group by bizdate,classes

此方式得到的結果中,每行只有乙個班次有值,同一日期同一班次的產量沒有合計起來

以下是正確結果,與上面不同的是,sum()函式用在了最外邊,並且group by 裡去掉了classes(此處影響很大)

select bizdate,

sum(case when classes='白班' then qty else 0 end) as '白班產量',

sum(case when classes='夜班' then qty else 0 end) as '夜班產量',

sum(qty ) as '日產量'

from test group by bizdate

說明:

第一種寫法之所以無法合計是因為在group by後多寫了classes這列,sqlserver會依次按照bizdate、classes去分組,結果就導致班次有重複的。

第二種寫法首先去掉多餘的classes列(此列是需要被合併的,寫在group by後純屬多餘還大大影響查詢結果),但是執行時會報錯說classes未包含在聚合函式裡,此時只需要把sum()函式移到case when 外面,即可。這樣就不必把classes寫在group by裡而去影響查詢結果了。

SqlServer經典行轉列 討論

use cubedemo goset nocount on 銷售模組 if object id n businesscommon salemodule n u isnot null drop table businesscommon salemodule gocreate table busines...

SQL server 行轉列 列轉行

1.簡單案例 create table student sid int primary key identity 1,1 主鍵自增 sname varchar 20 學生姓名 select from student create table class cid int primary key ide...

SQL SERVER 行轉列 列轉行

第一步 建立臨時表結構 create table student 建立臨時表 stuname nvarchar 20 學生名稱 stusubject nvarchar 20 考試科目 stuscore int 考試成績 drop table student 刪除臨時表 select from stu...