【问题标题】:SQL group by splitted dataSQL 按拆分数据分组
【发布时间】:2020-08-01 21:54:51
【问题描述】:

我有一张如下所示的表格:

   Name  |      Temperament
----------------------------------------
 "Husky" | "Smart, Loyal, Cute"
 "Poodle"| "Smart, Cute"
 "Golden"| "Cute, Loyal, Caring, Loving"

我想将这些数据投影为一组气质。 例如:

Temperament |             Name            | Count(Optional)
-----------------------------------------------------------   
"Smart"     | "Poodle", "Husky"           | 2
"Loyal"     | "Husky", "Golden"           | 2
"Cute"      | "Poodle", "Golden", "Husky" | 3
"Caring"    | "Golden"                    | 1
"Loving"    | "Golden"                    | 1

我的问题是我找不到一种方法来拆分表中的字符串并操纵这些数据。 如果有人能帮我解决这个问题,那就太好了。

如果无法完成纯 SQL,告诉我正在使用实体框架可能会有所帮助,如果可以在其中编写解决方案,那可能会更好。

谢谢大家。

【问题讨论】:

  • 在纯 SQL 中可以做到这一点,但这取决于您的数据库。请用您正在运行的数据库标记您的问题:sqlserver、postgresql、oracle...?
  • 每个数据是否像示例中一样有双引号?
  • @GMB 据我所知,我的数据库是 Oracle(我不确定,因为我使用的是 .NET 的实体框架,正如我提到的)。
  • @etsuhisa 不,这是为了表明我在谈论字符串。

标签: sql .net entity-framework csv recursive-query


【解决方案1】:

这可以在纯 SQL 中完成。在 Oracle 中,您可以使用 regexp 函数和正则表达式来拆分分隔字符串,然后使用字符串聚合生成每个气质的名称列表:

with cte (name, temperament, temp, cnt, lvl) as (
    select 
        name, 
        temperament, 
        regexp_substr (temperament, '[^, ]+', 1, 1) temp, 
        regexp_count(temperament, ',') cnt,
        1 lvl 
    from mytable
    union all
    select 
        name, 
        temperament, 
        regexp_substr (temperament, '[^, ]+', 1, lvl  + 1), 
        cnt,
        lvl + 1
    from cte
    where lvl <= cnt
)
select 
    temp temperament, 
    listagg(name, ', ') within group(order by name) name, 
    count(*) cnt
from cte
group by temp
order by 1

Demo on DB Fiddle

气质 |姓名 |碳纳米管 :------------ | :-------------------- | --: 关怀 |金色 | 1 可爱 |金色, 哈士奇, 贵宾犬 | 3 爱 |金色 | 1 忠诚 |金,哈士奇 | 2 智能 |哈士奇、贵宾犬 | 2

【讨论】:

    【解决方案2】:

    如果有人需要答案:

    var result = (from t in ((from t1 in db.mytables select new {tmp= t1.TEMP1}).Concat(from t2 in db.mytables select new {tmp= t2.TEMP2}).Concat(从 t3 in db.mytables select new {tmp= t3.TEMP3})) group t.tmp by t.tmp into g select new { tmp = g.Key, cnx=g.Count()}).ToList();

    希望对某人有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-06
      • 2018-03-28
      • 2019-08-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多