T- SQL Запрос количества кросс-таблиц - PullRequest
0 голосов
/ 02 февраля 2020

Если у вас есть следующий набор данных:

enter image description here

... и я хочу сделать сортировку по кросс-таблице, подсчитав данные по заданным значениям c критерии, например:

Критерии цвета : строка содержит «синий», «красный», «желтый» или «зеленый» (без учета регистра)

Критерии типа : Строка содержит «Car», «Lorry» или «Bus (без учета регистра)

... и я хотел бы, чтобы результат выглядел следующим образом:

enter image description here

Есть ли запрос SQL, который я могу выполнить для исходных данных, чтобы получить искомый результат?

Ответы [ 2 ]

0 голосов
/ 02 февраля 2020

Вы можете использовать CROSS APPLY с условным агрегированием; CROSS APPLY упрощает генерацию списка цветов:

select c.colour,
  sum(case when v.VehicleData like '%Car%' then 1 else 0 end) Car,
  sum(case when v.VehicleData like '%Lorry%' then 1 else 0 end) Lorry,
  sum(case when v.VehicleData like '%Bus%' then 1 else 0 end) Bus
from vehicles v
cross apply (values ('Blue'), ('Red'), ('Yellow'), ('Green')
) AS c(colour)
where v.VehicleData like '%' + c.colour + '%'
group by c.colour

Вывод:

colour  Car Lorry   Bus
Blue    3   1       0
Red     1   2       0
Yellow  0   1       1
Green   0   0       2

Демонстрация на dbfiddle

0 голосов
/ 02 февраля 2020

С условным агрегированием:

select c.colour,
  count(case when t.VehicleData like '%Car%' then 1 end) Car,
  count(case when t.VehicleData like '%Lorry%' then 1 end) Lorry,
  count(case when t.VehicleData like '%Bus%' then 1 end) Bus
from (
  select 'Blue' colour union all 
  select 'Red' union all
  select 'Yellow' union all
  select 'Green'
) c left join tbl1 t
on t.VehicleData like '%' + c.colour + '%'
group by c.colour

См. Демоверсию . Результаты:

> colour | Car | Lorry | Bus
> :----- | --: | ----: | --:
> Blue   |   3 |     1 |   0
> Red    |   1 |     2 |   0
> Yellow |   0 |     1 |   1
> Green  |   0 |     0 |   2
...