2016-06-21 198 views
3

我已經在#temp表如下數據:聚合函數

Id code  Fname  CompanyId FieldName   Value 
---------------------------------------------------------------- 
465 00133 JENN WILSON  1   ERA    1573 
465 00133 JENN WILSON  1   ESHIFTALLOW  3658 
465 00133 JENN WILSON  1   NETPAY   51560 

我想要做以下操作即

一行將另外兩列,即ERA + ESHIFTALLOW 其他行將被扣除&三列的補充,即NETPAY - ERA + ESHIFTALLOW 我曾嘗試在SQL Server中使用case語句。

要求如下

的輸出,其中Field1= ERA + ESHIFTALLOW & Filed2=NETPAY - ERA + ESHIFTALLOW

Id code  Fname  CompanyId FieldName   Value 
---------------------------------------------------------------- 
465 00133 JENN WILSON  1   Field1   5231 
465 00133 JENN WILSON  1   Filed2   46329 

我曾使用SQL Server Case語句,但沒有得到適當的輸出 SQL查詢嘗試:Aggregate option in SQL Server CASE statement

回答

3

我看到至少有兩種方法來獲得這些結果。一個組或一個關鍵點

在下面的示例中顯示了2個方法。

CREATE TABLE #Temp (Id INT, code VARCHAR(5), Fname VARCHAR(20), CompanyId INT, FieldName VARCHAR(20), Value INT); 

insert into #Temp (Id, code, Fname, CompanyId, FieldName, Value) 
values 
(465,00133,'JENN WILSON',1,'ERA',1573), 
(465,00133,'JENN WILSON',1,'ESHIFTALLOW',3658), 
(465,00133,'JENN WILSON',1,'NETPAY',51560); 

with Q AS (
    SELECT Id, code, Fname, CompanyId, 
    sum(case when FieldName = 'ERA' then Value end) as ERA, 
    sum(case when FieldName = 'ESHIFTALLOW' then Value end) as ESHIFTALLOW, 
    sum(case when FieldName = 'NETPAY' then Value end) as NETPAY 
    from #Temp 
    group by Id, code, Fname, CompanyId 
) 
select Id, code, Fname, CompanyId, 'Field1' as FieldName, (ERA + ESHIFTALLOW) as Value from Q 
union all 
select Id, code, Fname, CompanyId, 'Field2', (NETPAY - ERA + ESHIFTALLOW) from Q 
; 

with Q AS (
    SELECT Id, code, Fname, CompanyId, 
    (ERA + ESHIFTALLOW) as Field1, 
    (NETPAY - ERA + ESHIFTALLOW) as Field2 
    FROM (SELECT * FROM #Temp) s 
    PIVOT (SUM(VALUE) FOR FieldName IN (ERA, ESHIFTALLOW, NETPAY)) p 
) 
select Id, code, Fname, CompanyId, 'Field1' as FieldName, Field1 as Value from Q 
union all 
select Id, code, Fname, CompanyId, 'Field2', Field2 from Q 
; 

注意,SUM(VALUE)代替MAX(VALUE)。在這種情況下,它會產生相同的結果。這真的只是一個選擇。

1

我不知道這個解決方案是否接近最高效率,但它應該工作:

SELECT 
    BASE.*, 
    ERA.Value AS ERA, 
    ESALLOW.Value AS ESHIFTALLOW, 
    ERA.Value + ESALLOW.Value AS Field1, 
    etc... 
FROM (
    SELECT DISTINCT Id, code, Fname, CompanyId 
    FROM #TEMP) BASE 
LEFT OUTER JOIN (
    SELECT Id, Value 
    FROM #TEMP 
    WHERE FieldName = 'ERA') ERA 
ON BASE.Id = ERA.Id 
LEFT OUTER JOIN (
    SELECT Id, Value 
    FROM #TEMP 
    WHERE FieldName = 'ESHIFTALLOW') ESALLOW 
ON BASE.Id = ESALLOW.Id 

這爲您提供了一個簡單的表格,它在單獨的列中而不是在單獨的行中具有各種類型的值。這使得計算成爲可能。

2

大廈倚重LukStorms的回答,您可以使用PIVOT和UNPIVOT得到你想要的結果:

CREATE TABLE #Temp 
    (Id INT, Code VARCHAR(5), Fname VARCHAR(20), CompanyId INT, FieldName VARCHAR(20), Value INT); 

INSERT INTO #Temp 
    (Id, Code, Fname, CompanyId, FieldName, Value) 
VALUES 
    (465,00133, 'JENN WILSON', 1, 'ERA', 1573), 
    (465,00133, 'JENN WILSON', 1, 'ESHIFTALLOW', 3658), 
    (465,00133, 'JENN WILSON', 1, 'NETPAY', 51560); 


SELECT Id, Code, Fname, CompanyId, FieldName, Value 
FROM (
    SELECT Id, Code, Fname, CompanyId, 
    ERA + ESHIFTALLOW AS Field1, 
    NETPAY - ERA + ESHIFTALLOW AS Field2 
    FROM (
     SELECT * 
     FROM #Temp 
    ) AS s 
    PIVOT ( 
     SUM(Value) 
     FOR FieldName IN (ERA, ESHIFTALLOW, NETPAY) 
    ) AS p 
) AS r 
UNPIVOT (
    Value 
    FOR FieldName IN (Field1, Field2) 
) AS u 
; 
+0

沒想到這一個的。不錯的一個:)對於UNPIVOT來說,最終看起來比聯盟更好。 – LukStorms