2015-01-02 3 views
0

У меня есть таблица в SQL сервере, который что-то вроде этого,поворота строки и вычитать значения в SQL Server 2012

Name Count1 Count2 
------------------------ 
AAA  10  15 
BBB  10  NULL 
CCC  NULL  NULL 
DDD  20  10 
EEE  NULL  5 

Я хочу использовать стержень и получить разницу между Count1 и count2.

Результат должен быть таким,

AAA  BBB CCC DDD  EEE 
--------------------------------- 
-5  10  0  10  -5 

Позвольте мне знать, как я могу это сделать. Любые идеи будут полезны.

Спасибо.

ответ

1

Find difference в исходном Pivot запросе

SELECT * 
FROM (SELECT name, 
       Isnull(Count1, 0) - Isnull(Count2, 0) AS cnt 
     FROM tablename)a 
     PIVOT (Max(cnt) 
      FOR name IN ([AAA], 
          [BBB], 
          [CCC], 
          [DDD], 
          [EEE])) pv 

Или используйте Conditional Aggregate

SELECT Max(CASE WHEN name = 'AAA' THEN Isnull(Count1, 0) - Isnull(Count2, 0) END) [AAA], 
     Max(CASE WHEN name = 'BBB' THEN Isnull(Count1, 0) - Isnull(Count2, 0) END) [BBB], 
     Max(CASE WHEN name = 'CCC' THEN Isnull(Count1, 0) - Isnull(Count2, 0) END) [CCC], 
     Max(CASE WHEN name = 'DDD' THEN Isnull(Count1, 0) - Isnull(Count2, 0) END) [DDD], 
     Max(CASE WHEN name = 'EEE' THEN Isnull(Count1, 0) - Isnull(Count2, 0) END) [EEE] 
FROM tablename 
+0

Я попытался это, но я получаю ошибку. Неверное имя столбца «Count1». – Arpita

+0

@Arpita - у вас есть столбец под названием 'Count1' в вашей таблице –

+0

Да. Я прошу прощения. Я изменил колонку, и я забыл об этом. Теперь работает. Благодарю. – Arpita

0

Вы можете использовать CTE для вычисления разницы, а затем применить пивот к нему:

;WITH CTE AS 
(
    SELECT Name, ISNULL(Count1, 0) - ISNULL(Count2,0) AS Diff 
    FROM #T 
) 
SELECT [AAA], [BBB], [CCC], [DDD], [EEE] 
FROM CTE 
PIVOT 
(
    AVG(Diff) 
    FOR Name IN ([AAA], [BBB], [CCC], [DDD], [EEE]) 
) AS Pvt 
Смежные вопросы