count子字符串(在digital隐喻的reportbuilder中)

46qrfjad  于 2021-06-24  发布在  Mysql
关注(0)|答案(2)|浏览(269)

我正在尝试用reportbuilder(数字隐喻,而不是microsoft)创建一个报表,但是我很难让sql实现我想要的功能。
我有一张带字段的table building :

| building   |
+------------+
| WhiteHouse |
| TajMahal   |

还有一个带字段的表 locations :

| id | locations                                                       |
+----+-----------------------------------------------------------------+
| 1  | WhiteHouse:RoseGarden,WhiteHouse:MapRoom,TajMahal:MainSanctuary |
| 2  | TajMahal:NorthGarden,WhiteHouse:GreenRoom                       |

我想创建一个表格,显示每个建筑在建筑中的使用次数 locations ,就像这样:

| building   | count |
+------------+-------+
| WhiteHouse | 3     |
| TajMahal   | 2     |

人物 : 以及 , 从不在建筑物或房间名称中使用。即使是一个快速而肮脏的解决方案,假设建筑名称永远不会出现在房间名称中,对我来说也足够了。
当然,这在任何一种正常的编程语言中都是很容易做到的(比如 /\bWhiteHouse:/ ); 关键是让rb来做。欢迎提出解决办法的建议。

laik7k3q

laik7k3q1#

你可以试试这个,可能不是最快的,但肯定更简单的解决方案。

SELECT t1.building,
       ( SELECT SUM( ROUND( (LENGTH(t2.locations)  
                             - LENGTH(REPLACE(t2.locations, concat(t1.building, ':'), '')) 
                            ) / (LENGTH(t1.building) + 1)  
                          )
                   )
         FROM table2 AS t2  
       ) as count
FROM table1 as t1

sql fiddle演示

c3frrgcw

c3frrgcw2#

在sql server中,借助自定义sql拆分函数,可以使用“,”和“:”字符作为分隔符将位置字符串拆分为多个部分,如下所示

select 
    p2.val,
    count(p2.val)
from locations l
cross apply dbo.split(l.locations,',') p1
cross apply dbo.split(p1.val,':') p2
inner join building b
    on b.building = p2.val
group by p2.val

我不确定mysql中是否有类似的解决方案,如果有,请检查以下解决方案作为模板

相关问题