使用SQL查询排名计数

问题描述 投票:3回答:2

我使用DB浏览器的SQLite。我有以下格式的表:

+-----------+-------------------------------------+
| search_id |             search_town             |
+-----------+-------------------------------------+
|         1 | town1,town3                         |
|         2 | town2,town4,town5                   |
|         3 | town3,town5                         |
|         4 | town2,town5                         |
|         5 | town2,town3,town4                   |
+-----------+-------------------------------------+

我想这样做对的次数的COUNT town1通过town5已根据search_town出现,然后根据各自的计数降序排列的城镇。到目前为止,我有以下查询:

SELECT SUM(CASE WHEN search_location LIKE '%town01%' THEN 1 ELSE 0 END) AS town01,
SUM(CASE WHEN search_location LIKE '%town02%' THEN 1 ELSE 0 END) AS town02,
SUM(CASE WHEN search_location LIKE '%town03%' THEN 1 ELSE 0 END) AS town03,
SUM(CASE WHEN search_location LIKE '%town04%' THEN 1 ELSE 0 END) AS town04,
SUM(CASE WHEN search_location LIKE '%town05%' THEN 1 ELSE 0 END) AS town05
FROM searches

......但我无法做一个ORDER BY作为城镇和他们的罪名是因为这种格式列而非行输出

+-------+-------+-------+-------+-------+
| town1 | town2 | town3 | town4 | town5 |
+-------+-------+-------+-------+-------+
|    12 |    31 |    12 |    24 |    12 |
+-------+-------+-------+-------+-------+

是否有其他方法吗?欣赏任何意见。

sql sqlite count sql-order-by case-when
2个回答
1
投票

您正在使用CASE WHEN,将其转换成多行把你的输出单行,你可以尝试像以下。

;WITH cte 
     AS (SELECT * 
         FROM   (VALUES ('Town1'), 
                        ('Town2'), 
                        ('Town3'), 
                        ('Town4'), 
                        ('Town5')) T(town)) 
SELECT Count(*) [Count], 
       C.town 
FROM   [TABLE_NAME] T 
       INNER JOIN cte C 
               ON T.search_location LIKE '%' + C.town + '%' 
GROUP  BY C.town 
ORDER BY Count(*) DESC

Online DEMO

另一种方法可以是使用UNION ALL

SELECT * 
FROM   (SELECT Count(*) s, 
               'Town1'  AS Col 
        FROM   tablename 
        WHERE  search_location LIKE '%town1%' 
        UNION ALL 
        SELECT Count(*) s, 
               'Town2'  AS Col 
        FROM   tablename 
        WHERE  search_location LIKE '%town2%' 
        UNION ALL 
        SELECT Count(*) s, 
               'Town3'  AS Col 
        FROM   tablename 
        WHERE  search_location LIKE '%town3%' 
        UNION ALL 
        SELECT Count(*) s, 
               'Town4'  AS Col 
        FROM   tablename 
        WHERE  search_location LIKE '%town4%' 
        UNION ALL 
        SELECT Count(*) s, 
               'Town5'  AS Col 
        FROM   tablename 
        WHERE  search_location LIKE '%town5%') t 
ORDER  BY s DESC 

1
投票

您可以使用递归公用表表达式(CTE)打开逗号分隔的列表为一组行。当表进行归一化,可以按城镇和排序递减计数:

WITH    rec(town, remain)
AS      (
        SELECT  SUBSTR(search_town, 0, INSTR(search_town, ','))  -- Before ,
        ,       SUBSTR(search_town, INSTR(search_town, ',')+1) || ','  -- After ,
        FROM    t1
        UNION ALL
        SELECT  SUBSTR(remain, 0, INSTR(remain, ','))  -- Before ,
        ,       SUBSTR(remain, INSTR(remain, ',')+1)  -- After ,
        FROM    rec
        WHERE   LENGTH(remain) > 0
        )
SELECT  town
,       COUNT(*)
FROM    rec
GROUP BY
        town
ORDER BY
        COUNT(*) DESC

想法从这个blog post。工作实例at sqliteonline

© www.soinside.com 2019 - 2024. All rights reserved.