2016-06-21 20 views
3

に私は#TEMPテーブルに次のデータを持っている:集計関数SQL Serverの

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 

私は、次の操作を行いたい

1行は、2つの列に加えだろう。すなわちERA + ESHIFTALLOW、すなわち 他の行は、3つの列、すなわち の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つの方法があります。グループ別またはピボットグループ

以下の例では、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(値)の代わりにMAX(値)を用いたことに留意されたいです。この場合、同じ結果が得られます。本当に選択肢に過ぎません。

1

私は見当がつかないこのソリューションが最も効率的に近いところにあるかどうか、それはうまくいくはずです:

これは、個別の行ではなく、別の列にすべての型の値を持つシンプルな表を提供します。これにより、計算が可能になります。

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

はこの考えていませんでした。素敵な1つ:最後にUNPIVOTするには、組合よりもよく見えます。 – LukStorms