Oracle SQL-从分隔字段返回计数

Oracle SQL-从分隔字段返回计数,oracle,Oracle,我对SQL相当缺乏经验,所以希望这个问题不会太傻。以下是场景: 我有一个VARCHAR2列,它存储由product分隔的一系列值。根据客户的不同,他们可以有一个或多个产品。我正在尝试编写一个查询,该查询将返回值,但也将提供每种类型或产品的计数 例如: ProductColumn: P1, P2, P3, P4 Table: TableAccount Sample Value 1: P1:P2:P3 Sample Value 2: P1 Sample Value 3: P2:P3 我的当前查询仅

我对SQL相当缺乏经验,所以希望这个问题不会太傻。以下是场景:

我有一个VARCHAR2列,它存储由product分隔的一系列值。根据客户的不同,他们可以有一个或多个产品。我正在尝试编写一个查询,该查询将返回值,但也将提供每种类型或产品的计数

例如:

ProductColumn: P1, P2, P3, P4
Table: TableAccount
Sample Value 1: P1:P2:P3
Sample Value 2: P1
Sample Value 3: P2:P3
我的当前查询仅返回所有不同值类型的计数,包括分隔值:

select 
ProductColumn,
count(8) cnt
from TableAccount
group by ProductColumn

如有任何建议,将不胜感激

如果产品代码由冒号分隔,则可以使用子字符串从分隔冒号中提取代码值。这允许您返回调用者,每个调用者在单独的字段中,因此求和、分组等。但是,如果任何值超过两个,这将变得混乱 字节。这就是为什么数据规范化规则明确规定在一个表列中不放置多个数据段的原因。如果是我,我会编写一个PL SQL,将它们分离出来,并将其干净地写入一个规范化表,然后从该表查询。为了修复这个设计缺陷,我会对我的老板大发雷霆

Oracle 11g R2架构设置

CREATE TABLE TableAccount ( value ) AS
          SELECT 'P1:P2:P3' FROM DUAL
UNION ALL SELECT 'P1' FROM DUAL
UNION ALL SELECT 'P2:P3' FROM DUAL
UNION ALL SELECT 'P1:P3' FROM DUAL
UNION ALL SELECT 'P1:P4' FROM DUAL
UNION ALL SELECT 'P5' FROM DUAL;
SELECT item,
       COUNT(1) AS frequency
FROM   (
        SELECT REGEXP_SUBSTR( value, '[^:]+', 1, COLUMN_VALUE ) AS item
        FROM   TableAccount t,
               TABLE(
                  CAST(
                    MULTISET(
                      SELECT LEVEL
                      FROM   DUAL
                      CONNECT BY  LEVEL <= REGEXP_COUNT( t.value, '[^:]+')
                    ) AS sys.OdciNumberList
                  )
                )
        )
GROUP BY item
ORDER BY item
| ITEM | FREQUENCY |
|------|-----------|
|   P1 |         4 |
|   P2 |         2 |
|   P3 |         3 |
|   P4 |         1 |
|   P5 |         1 |
查询1

CREATE TABLE TableAccount ( value ) AS
          SELECT 'P1:P2:P3' FROM DUAL
UNION ALL SELECT 'P1' FROM DUAL
UNION ALL SELECT 'P2:P3' FROM DUAL
UNION ALL SELECT 'P1:P3' FROM DUAL
UNION ALL SELECT 'P1:P4' FROM DUAL
UNION ALL SELECT 'P5' FROM DUAL;
SELECT item,
       COUNT(1) AS frequency
FROM   (
        SELECT REGEXP_SUBSTR( value, '[^:]+', 1, COLUMN_VALUE ) AS item
        FROM   TableAccount t,
               TABLE(
                  CAST(
                    MULTISET(
                      SELECT LEVEL
                      FROM   DUAL
                      CONNECT BY  LEVEL <= REGEXP_COUNT( t.value, '[^:]+')
                    ) AS sys.OdciNumberList
                  )
                )
        )
GROUP BY item
ORDER BY item
| ITEM | FREQUENCY |
|------|-----------|
|   P1 |         4 |
|   P2 |         2 |
|   P3 |         3 |
|   P4 |         1 |
|   P5 |         1 |

不完全确定你得到的是什么和你想要的是什么。样本数据将有助于澄清你想要什么。。。ProductColumn具有分隔值,而不是一个值,您想将所有值分解出来吗?您可以尝试类似的方法,然后进行组计数:此处没有足够的信息来给出正确的答案。看起来您需要找到一个好的函数来将逗号分隔的值拆分为行。谢谢大家。我试图做的是返回所有产品的计数,但不是按分隔值。例如,我不希望值显示为:P1:P2:P3,而是希望值显示为P1-2、P2-2、P3-2。