2016-11-10 16 views
3

私はSQLを学習しており、テーブルの値で作成された新しい列を作成するクエリを作成したいと考えています。私はtransactionsという名前の列を持ち、同じ会社によって複数の取引があります。表は次のようになります。ピボットを使用して行を列に変換する

Id Name 5.00 10.00 15.00 Sum 
1 John 5.00 20.00 0  25.00 
2 Adam 5.00 0  15.00 20.00 

私はPIVOT機能でそれをやって検討していたが、私は、実装に問題を抱えている:

Id Name Payd 
1 John 5.00 
2 Adam 5.00 
3 John 10.00 
4 John 10.00 
5 Adam 15.00 

が、私はこのようなものを作りたいです。

(select emplployer, CAST (4.00 as decimal(10,0)) as [4.00], 
CAST (5.00 as decimal(10,0)) as [5.00], 
CAST (10.00 as decimal(10,0)) as [10.00], 
CAST (18.00 as decimal(10,0)) as [18.00], 
CAST (20.00 as decimal(10,0)) as [20.00] 
from (select Name, cast(Payd as decimal(10,0)) as summ from employee) q1 
pivot 
(
    sum(summ) for employer in ([4.00], [5.00], [10.00], [18.00], [20.00]) 
)pvt; 

答えて

3

条件付き集計方法:ピボット使ってそれを行うには

SELECT 
    Name 
    ,SUM(CASE WHEN Payd = 5 THEN Payd ELSE 0 END) as [5.00] 
    ,SUM(CASE WHEN Payd = 10 THEN Payd ELSE 0 END) as [10.00] 
    ,SUM(CASE WHEN Payd = 15 THEN Payd ELSE 0 END) as [15.00] 
    ,SUM(Payd) as [Sum] 
FROM 
    @Employees 
GROUP BY 
    Name 

ワンウェイ:

;WITH cte AS (
    SELECT 
     Name 
     ,Payd 
     ,Payd as PaydColNames 
    FROM 
     @Employees 
) 

SELECT 
    Name 
    ,[5.00] = ISNULL([5.00],0) 
    ,[10.00] = ISNULL([10.00],0) 
    ,[15.00] = ISNULL([15.00],0) 
    ,[Sum] = ISNULL([5.00],0) + ISNULL([10.00],0) + ISNULL([15.00],0) 
FROM 
    cte 
    PIVOT (
     SUM(Payd) FOR PaydColNames IN ([5.00],[10.00],[15.00]) 
    ) p 

問題をあなたが持っているように見えるあなたがある私のコードは次のようになります同じ列をピボットに使用しようとすると、集計しても目的の結果が得られません。したがって、PIVOTと集計の両方でデータを使用できるようにPayd列を複製する必要があります。値がNULLのときに0を望むので、ISNULLまたはCOALESCEを使用してNULLを除去する必要があります。私の意見では、このような使用のためにConditional Aggregationが優れたサービスを提供します。

そんなにありがとう、素敵な説明だった

テストデータ

DECLARE @Employees AS TABLE (Id INT, Name VARCHAR(50), Payd MONEY) 
INSERT INTO @Employees VALUES 
(1,'John',5.00) 
,(2,'Adam',5.00) 
,(3,'John',10.00) 
,(4,'John',10.00) 
,(5,'Adam',15.00) 
+0

! – vidooo

関連する問題