У меня есть такая таблица:
SoftwareName Count Country Project 15 Canada Visio 12 Canada Project 10 USA Visio 5 USA
Как мне запросить его, чтобы получить сводку вроде ...
SoftwareName Canada USA Total Project 15 10 25 Visio 12 5 17
Как это сделать в T-SQL?


SELECT SoftwareName,
SUM( CASE Country WHEN 'Canada' THEN [Count] ELSE 0 END ) AS Canada,
SUM( CASE Country WHEN 'USA' THEN [Count] ELSE 0 END ) AS USA,
SUM( [Count] ) AS Total
FROM [Table]
GROUP BY SoftwareName;
Это называется поворотом таблицы. В вашем простом случае всего два столбца; в общем, может быть около 200 стран, и в этом случае поворот становится довольно трудным.
В Интернете есть много ресурсов, описывающих, как это сделать: Google для "pivot table sql".
в SQL 2005 или более поздних версиях есть ключевое слово SQL "Pivot", которое делает это за вас, Ознакомьтесь со следующей ссылкой:
Хорошо ... Вот как это сделать с помощью PIVOT:
SELECT Softwarename, Canada, USA, Canada + USA As TOTAL from SoftwareDemo
PIVOT
(
SUM([Count])
FOR Country
IN (Canada, USA)
) AS x
Softwarename Canada USA TOTAL
-------------------------------------------------- ----------- ----------- -----------
Project 15 10 25
Visio 12 5 17
(2 row(s) affected)
Поскольку в качестве тестовой нагрузки используются только образцы данных, их производительность не сильно отличается. Я думаю, что этот PIVOT является решением предпочтительный для такого рода требований к данным.
Я думаю, вы можете использовать эту ссылку:
Сумма уникальных записей - производительность лучше, чем у курсора
и я думаю, что использование функции PIVOT имеет лучшую функцию оценки производительности SUM ().!
Привет, Марлон, я тоже пробовал это решение, и, хотя я не вижу никаких улучшений с точки зрения времени выполнения, я думаю, что это решение очень элегантно и его легко изменить позже. Большое спасибо.