У меня есть 4 столбца с функциями Sum и Count.Я хочу конвертировать 4 столбца в 4 строки - PullRequest
0 голосов
/ 07 декабря 2018

Я использовал этот запрос

Select Count(PostID) As TotalPost,sum(Impressions) As TotalImpression, sum(Likes) As TotalLikes, Sum(Shares) As Shares, Sum(Engagements)AS Engagements
From dm.vSocialMediaPost;

Результат:

TotalPost TotalImpression TotalLikes   Shares  Engagements
712      |  1874273      |  29418     | 4231|   65326

Я хочу получить результат как

TotalPost             |712
TotalImpression       | 1874273      
TotalLikes            |29418  
Shares                |4231
Engagements           |65326

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Самый простой метод - несколько агрегаций:

Select 'TotalPost', count(*)
From dm.vSocialMediaPost
union all
select 'TotalImpression', sum(Impressions)
From dm.vSocialMediaPost
union all
select 'TotalLikes', sum(Likes)
From dm.vSocialMediaPost
union all 
select 'Shares', Sum(Shares)
From dm.vSocialMediaPost
union all
select 'Engagements', Sum(Engagements)
From dm.vSocialMediaPost; 

Однако, поскольку SQL Server поддерживает боковые объединения, лучший метод использует apply:

select v.*
from (select Count(PostID) As TotalPost, sum(Impressions) As TotalImpression, sum(Likes) As TotalLikes, Sum(Shares) As Shares, Sum(Engagements) as Engagements
      from dm.vSocialMediaPost
     ) x cross apply
     (values ('TotalPost', TotalPost),
             ('TotalImpression', TotalImpression),
             ('TotalLikes', TotalLikes),
             ('Shares', Shares),
             ('Engagements', Engagements)
     ) v(which, val);

Это "лучший"потому что это требует агрегирования (и, следовательно, чтения) таблицы только один раз.Это должно быть значительно быстрее, чем несколько агрегаций.

0 голосов
/ 07 декабря 2018

Вы можете использовать ключевое слово unpivot как:

select title, value 
  from
     ( Select Count(PostID) As TotalPost,
              sum(Impressions) As TotalImpression, 
              sum(Likes) As TotalLikes, 
              Sum(Shares) As Shares, 
              Sum(Engagements)AS Engagements
         From vSocialMediaPost ) p
unpivot  
   (value for Title in
      (TotalPost, TotalImpression, TotalLikes, Shares, Engagements)  
) unpvt;

Rextester Demo

0 голосов
/ 07 декабря 2018

Одним из вариантов является запрос объединения:

SELECT 'TotalPost' AS label, COUNT(*) AS total FROM dm.vSocialMediaPost
UNION ALL
SELECT 'TotalImpression', SUM(Impressions) FROM dm.vSocialMediaPost
UNION ALL
SELECT 'TotalLikes', SUM(Likes) FROM dm.vSocialMediaPost
UNION ALL
SELECT 'Shares', SUM(Shares) FROM dm.vSocialMediaPost
UNION ALL
SELECT 'Engagements', SUM(Engagements) FROM dm.vSocialMediaPost;
...