簡體   English   中英

將兩個匯總查詢合並為一個

[英]Combining two aggregate queries into one

對於某些情況,我正在制作一個連接到SQLite數據庫的圖像瀏覽器。 在瀏覽器中,相似的圖像被分組為一個事件(EventId),並且每個圖像(MicrosoftId)都帶有一些標記(名稱)

我在同一張表( TagsMSCV )上有這兩個查詢,但是提取了不同的信息。 最終,我需要在瀏覽器中合並信息,因此,如果可以合並這兩個查詢(也許使用JOIN?),對我來說將更快,更方便。 這些查詢的兩個結果共享EventId列。

第一個查詢():

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

第二查詢

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

正如您在兩個查詢中看到的那樣,我正在輸入標簽“領帶”,“男人”,“男性”,並獲取不同的信息。

SQL小提琴在這里: https : //www.db-fiddle.com/f/f8WNimjmZAj1XXeCj4PHB8/3

您可以使用內部聯接子查詢

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

您應該在一個查詢中完成全部操作:

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;

您需要兩次聚合才能獲得有關標簽計數的信息。 無需添加更多的聚合和聯接到查詢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM