Объединение двух сводных запросов в один - PullRequest
0 голосов
/ 08 февраля 2019

Для некоторого контекста я делаю браузер изображений, который подключен к базе данных SQLite.В браузере похожие изображения сгруппированы в событие (EventId) , а каждое изображение (MicrosoftId) помечено несколькими тегами (имя) .

У меня есть эти два запроса в одной и той же таблице ( TagsMSCV ), но я получаю другую информацию.В конечном итоге мне нужно объединить информацию в моем браузере, чтобы, если бы было возможно объединить эти два запроса (может быть, с JOIN?), Это было бы намного быстрее и удобнее для меня.Оба результата этих запросов имеют общий столбец EventId.

1-й запрос ():

SELECT EventId as 'event', count(*) as 'size',
    SUM(case when tag_count = 1 then 1 else 0 end) as '1',
    SUM(case when tag_count = 2 then 1 else 0 end) as '2',
    SUM(case when tag_count = 3 then 1 else 0 end) as '3'
FROM (SELECT EventId, MicrosoftId,
SUM(case when name in ('indoor', 'cluttered', 'screen') then 1 else 0 end) as tag_count 
FROM TagsMSCV GROUP BY EventId, MicrosoftId) TagsMSCV
GROUP BY EventId ORDER BY 3 DESC, 2 DESC, 1 DESC

2-й запрос

SELECT EventId,
    SUM(CASE WHEN name = 'indoor' THEN 1 ELSE 0 END) as indoor,
    SUM(CASE WHEN name = 'cluttered' THEN 1 ELSE 0 END) as cluttered,
    SUM(CASE WHEN name = 'screen' THEN 1 ELSE 0 END) as screen
FROM TagsMSCV WHERE name IN ('indoor', 'cluttered', 'screen')
GROUP BY EventId

Как видно из обоих запросов, я подаю теги 'галстук' 'человек', 'male' и получая другую информацию.

Скрипка SQL Здесь: https://www.db -fiddle.com / f / f8WNimjmZAj1XXeCj4PHB8 / 3

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Вы должны сделать все это в одном запросе:

SELECT EventId as event, count(*) as size,
       SUM(case when (indoor + cluttered + screen) = 1 then 1 else 0 end) as tc_1,
       SUM(case when (indoor + cluttered + screen) = 2 then 1 else 0 end) as tc_2,
       SUM(case when (indoor + cluttered + screen) = 3 then 1 else 0 end) as tc_3,
       SUM(indoor) as indoor,
       SUM(cluttered) as cluttered,
       SUM(screen) as screen
FROM (SELECT EventId, MicrosoftId,
             SUM(CASE WHEN name = 'indoor' THEN 1 ELSE 0 END) as indoor,
             SUM(CASE WHEN name = 'cluttered' THEN 1 ELSE 0 END) as cluttered,
             SUM(CASE WHEN name = 'screen' THEN 1 ELSE 0 END) as screen
      FROM TagsMSCV
      GROUP BY EventId, MicrosoftId
     ) TagsMSCV
GROUP BY EventId
ORDER BY 3 DESC, 2 DESC, 1 DESC;

Для получения информации о количестве тегов вам нужно два агрегата.Нет необходимости добавлять больше агрегатов и объединений в запрос.

0 голосов
/ 08 февраля 2019

Вы можете использовать подзапрос Inner join

SELECT TagsMSCV.EventId as 'event', count(*) as 'size',
    SUM(case when tag_count = 1 then 1 else 0 end) as '1',
    SUM(case when tag_count = 2 then 1 else 0 end) as '2',
    SUM(case when tag_count = 3 then 1 else 0 end) as '3',
    t.necktie, 
    t.man,
    t.male
FROM (
  SELECT EventId, MicrosoftId,
  SUM(case when name in ('necktie' 'man', 'male') then 1 else 0 end) as tag_count 
  FROM TagsMSCV GROUP BY EventId, MicrosoftId
) TagsMSCV
INNER JOIN (
  SELECT EventId,
      SUM(CASE WHEN name = 'necktie' THEN 1 ELSE 0 END) as necktie,
      SUM(CASE WHEN name = 'man' THEN 1 ELSE 0 END) as man,
      SUM(CASE WHEN name = 'male' THEN 1 ELSE 0 END) as male
  FROM TagsMSCV WHERE name IN ('necktie' 'man', 'male')
  GROUP BY EventId
) t on t.EventId = TagsMSCV.EventId 
GROUP BY TagsMSCV.EventId 
ORDER BY 3 DESC, 2 DESC, 1 DESC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...