2014-05-19 24 views
1

我想總結一下所有的CountHours和顯示迴轉欄。總爲所有周日和週一...特定用戶名。如何實現這個 ?這個查詢的如何彙總資料透視列的值,並將它添加到另一個透視型列

select FullName,Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Total 
    from 
    (Select UserId_Fk,ISNULL(CAST(CountHours as decimal(18,2)),0)as CountHours,[Day] f  rom CheckInCheckOut) 
    as convertedtable 
    inner join Users 
    on convertedtable.UserId_Fk=Users.UserId 
PIVOT 
(
SUM(CountHours) 
FOR Day 
IN([Sunday],[Monday],[Tuesday],[Wednesday],[Thursday],[Friday],[Saturday],[Total]) 
) 
as PivotTable 

結果是:

enter image description here

表結構:

Table[CheckInCheckOut]  

CheckInCheckOutId int 
    UserId_Fk  int 
    CountHours nvarchar(50)  
     Day nvarchar(50) 

實施例,將不勝感激。

回答

2

你應該計算總列字段,也就是說,它是不是在名單樞軸列。

數據

create table #CheckInCheckOut(Id int identity(1,1),UserId_Fk int,CountHours varchar(50),[Day] varchar(50)) 
INSERT INTO #CheckInCheckOut(UserId_Fk,CountHours,[Day]) VALUES 
(1,'2','Sunday'),(1,'2','Monday'),(1,'2','Tuesday'),(1,'2','Wednesday'),(1,'2','Thursday'),(1,'2','Friday'),(1,'2','Saturday') 
,(2,'3','Sunday'),(2,'3','Monday'),(2,'3','Tuesday'),(2,'3','Wednesday'),(2,'3','Thursday'),(2,'3','Friday'),(2,'3','Saturday') 
,(3,'3','Sunday'),(3,'3','Monday'),(3,'3','Tuesday'),(3,'3','Wednesday'),(3,'3','Thursday'),(3,'3','Friday'),(3,'3','Saturday') 


create table #Users(UserId int identity(1,1),FullName varchar(50)) 
INSERT #Users(FullName) values('Abdul'),('khan'),('Tariq') 

查詢發現總太:

select FullName 
,[Sunday] = SUM([Sunday]) 
,[Monday] = SUM([Monday]) 
,[Tuesday] = SUM([Tuesday]) 
,[Wednesday] = SUM([Wednesday]) 
,[Thursday] = SUM([Thursday]) 
,[Friday] = SUM([Friday]) 
,[Saturday] = SUM([Saturday]) 
, Total= SUM([Sunday]+[Monday]+[Tuesday]+[Wednesday]+[Thursday]+[Friday]+[Saturday]) 
    from 
    (Select UserId_Fk,ISNULL(CAST(CountHours as decimal(18,2)),0)as CountHours,[Day] 
    from #CheckInCheckOut) 
    as convertedtable 
    inner join #Users 
    on convertedtable.UserId_Fk=#Users.UserId 
PIVOT 
(
SUM(CountHours) 
FOR Day 
IN([Sunday],[Monday],[Tuesday],[Wednesday],[Thursday],[Friday],[Saturday]) 
) 
as PivotTable 
GROUP BY FullName 

輸出

enter image description here

而且如果u想總水平和垂直兩個再更換:

--GROUP BY FullName 
GROUP BY ROLLUP(FullName); 

更多後續鏈接https://stackoverflow.com/a/17142530/1915855

DROP TABLE #CheckInCheckOut 
DROP TABLE #Users 
+0

完美......... !!! – user3590485

+0

也,如果有任何列NULL,Total將不會有結果。如何在[Total = SUM([MONDAY] + .... + [Saturday])中處理NULL NULL – user3590485

+1

Total = SUM(ISNULL([MONDAY],0)+ ISNULL([TUESDAY],0)+ .... ..) –

0

試試這個方法就是這個例子。

創建表

CREATE TABLE cars 
    (
    car_id tinyint, 
    attribute varchar(20), 
    value varchar(20), 
    sumd decimal(18,2) 
    ) 

值插入到它

insert into cars(car_id, attribute, value, sumd) 
values  (1, 'Make', 'VW',1), 
      (1, 'Model', 'Rabbit',2), 
      (1, 'Color', 'Gold',3), 
      (2, 'Make', 'Jeep',4), 
      (2, 'Model', 'Wrangler',5), 
      (2, 'Color', 'Gray',6) 

爲了使總

declare @Columns2 VARCHAR(8000) 
declare @Sql VARCHAR(4000) 
declare @Columns VARCHAR(8000) 

SET @Columns = substring((select distinct ',['+attribute+']' from cars group by attribute for xml path('')),2,8000) 
    SET @Columns2 = substring((select distinct ',IsNull(['+attribute+'],0) as ['+attribute+']' from cars group by attribute for xml path('')),2,8000) 
    print @Columns 
    print @Columns2 

SET @SQL = 'SELECT car_id, '[email protected]+', total 
             FROM 
               (Select car_id,attribute, SUM(sumd) OVER (PARTITION BY attribute) as total 
               , sumd from cars) SourceData 
             PIVOT 
               (sum(sumd) for attribute in ('[email protected]+')) pivottable 
             Order by car_id ' 


     exec(@sql)