Конвертировать столбцы в группу по / count - PullRequest
0 голосов
/ 01 июня 2019

У меня есть следующий запрос, который отображает результат следующим образом:

enter image description here

Как я могу получить результат, отображающий, как этот, имея в виду, что болееТипы клиентов могут быть введены:

enter image description here

Create Table #temp
(
    [Name] varchar(50),
    Country varchar(50),
    ClientType varchar(50)
)

insert into #temp
(
    Name,
    Country ,
    ClientType
)
select 
    'Joe Bloggs',
    'USA',
    'Client Type 1'
union 
select
    'John Doe',
    'Canada',
    'Client Type 1'
union 
select
    'Jane Smith',
    'USA',
    'Client Type 2'

select
    Country,
    ClientType,
    count(*)
from
    #temp
group by
    Country,
    ClientType

drop table #temp

Ответы [ 4 ]

3 голосов
/ 01 июня 2019

Этот тип операции обычно называется круговой.Многие крупные поставщики БД имеют какой-то специальный синтаксис, который выполняет его, но я склонен делать это, используя стандартный sql:

SELECT 
  country,
  SUM(CASE WHEN clienttype = 'Client Type 1' THEN 1 END) as ClientType1,
  SUM(CASE WHEN clienttype = 'Client Type 2' THEN 1 END) as ClientType2
FROM
  #temp
GROUP BY country

Если бы вы запустили это без группировки и суммировали ключевые слова, вы бы получили набор результатов со странойстолбец (имеющий повторяющиеся значения) и столбец clienttype1, который содержит 1 каждый раз, когда тип клиента был 1, и ноль во всех других случаях, и столбец clienttype2, который был 1, когда тип клиента был 2, и ноль во все другие времена

Группировка по стране и суммирование наших столбцов со смешанным нулем / 1 дает число, равное нулю, считается равным нулю

На сервере sql вы увидите сообщение «нулевое значение удаляется агрегированной операцией», ноэто рекомендация и в этом случае желательно.Если это другие вы, вы можете привести случай, когда предложение «else 0» имеет тот же эффект.

Я мог бы также использовать COUNT вместо SUM, но для этого нужно действительно смешать 1 / ноль, потому что count будет считать значение 0 «счетным значением» и считать егокак 1. Нули имеют жизненно важное значение при использовании COUNT

2 голосов
/ 01 июня 2019

просто вам нужно использовать PIVOT следующим образом (добавьте в ваш скрипт перед выпадением #temp):

Select * from #temp
Pivot (Count(Name) for
ClientType in ([Client Type 1],[Client Type 2]))
As TablaPivot
2 голосов
/ 01 июня 2019

Одной из возможностей является использование условного агрегирования только с учетом определенного типа клиента в столбце.

1 голос
/ 01 июня 2019

Попробуйте использовать PIVOT.Ниже некоторые идеи, как это должно работать с использованием PIVOT-

WITH CTE(Country,ClientType,Count)
AS
(
    SELECT 'Canada','Client Type 1',1 UNION ALL
    SELECT 'USA','Client Type 1',1 UNION ALL
    SELECT 'USA','Client Type 2',1
)

SELECT Country,
ISNULL([Client Type 1],0) [Client Type 1],
ISNULL([Client Type 2],0)  [Client Type 2]
FROM
(
SELECT * FROM CTE
) AS P
PIVOT
(
    SUM(Count)
    FOR ClientType IN ([Client Type 1],[Client Type 2])
)AS PVT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...