Sql Oracle XE,基于一列计算和显示不同的行组合

Sql Oracle XE,基于一列计算和显示不同的行组合,sql,oracle,combinations,permutation,Sql,Oracle,Combinations,Permutation,需要复杂查询的帮助。这是我的表格摘录: USERID SERVICE 1 A 1 B 2 A 3 A 3 B 4 A 4 C 5 A 6 A 7 A 7 B 好的,我希望查询返回并显示我的表中存在的所有可能的组合,以及它们基于服务列的各自计数。例如,第一个用户有A和B服务,这是一个组合,只发生过一次。下一个用户只有

需要复杂查询的帮助。这是我的表格摘录:

USERID    SERVICE
1         A
1         B
2         A
3         A
3         B
4         A
4         C
5         A
6         A
7         A
7         B
好的,我希望查询返回并显示我的表中存在的所有可能的组合,以及它们基于服务列的各自计数。例如,第一个用户有A和B服务,这是一个组合,只发生过一次。下一个用户只有一个服务,这是又一次发生的组合。第三个用户有服务A和B,这种情况已经发生过一次,现在这种组合的计数是2,以此类推。因此,基于此特定输入的输出将是如下表:

A  AB  AC  ABC  B  BC
3  3   1   0    0  0
所以要澄清一点,如果有3个服务,那么就有3个!可能的组合;3x2x1=6,它们是A、B、C、AB、AC、BC和ABC。我的表应该包含分配了这些服务组合的用户数

我尝试使用此查询构建矩阵,然后使用多维数据集函数获取所有计数:

select service_A, service_B, service_C from 
  (select USERID,
  max(case when SERVICE =A then 1 else null end) service_A,
  max(case when SERVICE =B then 1 else null end) service_B,
  max(case when SERVICE =C then 1 else null end) service_C
  from SOME_TABLE) 
group by CUBE(service_A, service_B,service_C);

但我不知道所有组合的数量。我只需要发生的组合,所以计数0是不必要的,但可以显示它们。谢谢。

不要将其输出为动态列(如果不使用PL/SQL和动态SQL,很难做到),而是将其输出为行(如果您有前端,那么它通常可以将行转换为列,比oracle容易得多):

Oracle安装程序

CREATE TABLE some_table ( USERID, SERVICE ) AS
SELECT 1, 'A' FROM DUAL UNION ALL
SELECT 1, 'B' FROM DUAL UNION ALL
SELECT 2, 'A' FROM DUAL UNION ALL
SELECT 3, 'A' FROM DUAL UNION ALL
SELECT 3, 'B' FROM DUAL UNION ALL
SELECT 4, 'A' FROM DUAL UNION ALL
SELECT 4, 'C' FROM DUAL UNION ALL
SELECT 5, 'A' FROM DUAL UNION ALL
SELECT 6, 'A' FROM DUAL UNION ALL
SELECT 7, 'A' FROM DUAL UNION ALL
SELECT 7, 'B' FROM DUAL;
SELECT service,
       COUNT( userid ) AS num_users
FROM   (
  SELECT userid,
         LISTAGG( service ) WITHIN GROUP ( ORDER BY service ) AS service
  FROM   some_table
  GROUP BY userid
)
GROUP BY service;
SERVICE  NUM_USERS
------- ----------
AC               1 
A                3 
AB               3 
VARIABLE cur REFCURSOR;

DECLARE
  TYPE string_table IS TABLE OF VARCHAR2(4000);
  TYPE int_table IS TABLE OF INT;
  t_services string_table;
  t_counts   int_table;
  p_sql      CLOB;
BEGIN
  SELECT service,
         COUNT( userid ) AS num_users
  BULK COLLECT INTO t_services, t_counts
  FROM   (
    SELECT userid,
           CAST( LISTAGG( service ) WITHIN GROUP ( ORDER BY service ) AS VARCHAR2(2) ) AS service
    FROM   some_table
    GROUP BY userid
  )
  GROUP BY service;

  p_sql := EMPTY_CLOB() || 'SELECT ';
  p_sql := p_sql || t_counts(1) || ' AS "' || t_services(1) || '"';
  FOR i IN 2 .. t_services.COUNT LOOP
    p_sql := p_sql || ', ' || t_counts(i) || ' AS "' || t_services(i) || '"';
  END LOOP;
  p_sql := p_sql || ' FROM DUAL';

  OPEN :cur FOR p_sql;
END;
/

PRINT cur;
AC  A   AB
--- --- ---
1   3   3  
查询

CREATE TABLE some_table ( USERID, SERVICE ) AS
SELECT 1, 'A' FROM DUAL UNION ALL
SELECT 1, 'B' FROM DUAL UNION ALL
SELECT 2, 'A' FROM DUAL UNION ALL
SELECT 3, 'A' FROM DUAL UNION ALL
SELECT 3, 'B' FROM DUAL UNION ALL
SELECT 4, 'A' FROM DUAL UNION ALL
SELECT 4, 'C' FROM DUAL UNION ALL
SELECT 5, 'A' FROM DUAL UNION ALL
SELECT 6, 'A' FROM DUAL UNION ALL
SELECT 7, 'A' FROM DUAL UNION ALL
SELECT 7, 'B' FROM DUAL;
SELECT service,
       COUNT( userid ) AS num_users
FROM   (
  SELECT userid,
         LISTAGG( service ) WITHIN GROUP ( ORDER BY service ) AS service
  FROM   some_table
  GROUP BY userid
)
GROUP BY service;
SERVICE  NUM_USERS
------- ----------
AC               1 
A                3 
AB               3 
VARIABLE cur REFCURSOR;

DECLARE
  TYPE string_table IS TABLE OF VARCHAR2(4000);
  TYPE int_table IS TABLE OF INT;
  t_services string_table;
  t_counts   int_table;
  p_sql      CLOB;
BEGIN
  SELECT service,
         COUNT( userid ) AS num_users
  BULK COLLECT INTO t_services, t_counts
  FROM   (
    SELECT userid,
           CAST( LISTAGG( service ) WITHIN GROUP ( ORDER BY service ) AS VARCHAR2(2) ) AS service
    FROM   some_table
    GROUP BY userid
  )
  GROUP BY service;

  p_sql := EMPTY_CLOB() || 'SELECT ';
  p_sql := p_sql || t_counts(1) || ' AS "' || t_services(1) || '"';
  FOR i IN 2 .. t_services.COUNT LOOP
    p_sql := p_sql || ', ' || t_counts(i) || ' AS "' || t_services(i) || '"';
  END LOOP;
  p_sql := p_sql || ' FROM DUAL';

  OPEN :cur FOR p_sql;
END;
/

PRINT cur;
AC  A   AB
--- --- ---
1   3   3  
输出

CREATE TABLE some_table ( USERID, SERVICE ) AS
SELECT 1, 'A' FROM DUAL UNION ALL
SELECT 1, 'B' FROM DUAL UNION ALL
SELECT 2, 'A' FROM DUAL UNION ALL
SELECT 3, 'A' FROM DUAL UNION ALL
SELECT 3, 'B' FROM DUAL UNION ALL
SELECT 4, 'A' FROM DUAL UNION ALL
SELECT 4, 'C' FROM DUAL UNION ALL
SELECT 5, 'A' FROM DUAL UNION ALL
SELECT 6, 'A' FROM DUAL UNION ALL
SELECT 7, 'A' FROM DUAL UNION ALL
SELECT 7, 'B' FROM DUAL;
SELECT service,
       COUNT( userid ) AS num_users
FROM   (
  SELECT userid,
         LISTAGG( service ) WITHIN GROUP ( ORDER BY service ) AS service
  FROM   some_table
  GROUP BY userid
)
GROUP BY service;
SERVICE  NUM_USERS
------- ----------
AC               1 
A                3 
AB               3 
VARIABLE cur REFCURSOR;

DECLARE
  TYPE string_table IS TABLE OF VARCHAR2(4000);
  TYPE int_table IS TABLE OF INT;
  t_services string_table;
  t_counts   int_table;
  p_sql      CLOB;
BEGIN
  SELECT service,
         COUNT( userid ) AS num_users
  BULK COLLECT INTO t_services, t_counts
  FROM   (
    SELECT userid,
           CAST( LISTAGG( service ) WITHIN GROUP ( ORDER BY service ) AS VARCHAR2(2) ) AS service
    FROM   some_table
    GROUP BY userid
  )
  GROUP BY service;

  p_sql := EMPTY_CLOB() || 'SELECT ';
  p_sql := p_sql || t_counts(1) || ' AS "' || t_services(1) || '"';
  FOR i IN 2 .. t_services.COUNT LOOP
    p_sql := p_sql || ', ' || t_counts(i) || ' AS "' || t_services(i) || '"';
  END LOOP;
  p_sql := p_sql || ' FROM DUAL';

  OPEN :cur FOR p_sql;
END;
/

PRINT cur;
AC  A   AB
--- --- ---
1   3   3  
动态列的PL/SQL

CREATE TABLE some_table ( USERID, SERVICE ) AS
SELECT 1, 'A' FROM DUAL UNION ALL
SELECT 1, 'B' FROM DUAL UNION ALL
SELECT 2, 'A' FROM DUAL UNION ALL
SELECT 3, 'A' FROM DUAL UNION ALL
SELECT 3, 'B' FROM DUAL UNION ALL
SELECT 4, 'A' FROM DUAL UNION ALL
SELECT 4, 'C' FROM DUAL UNION ALL
SELECT 5, 'A' FROM DUAL UNION ALL
SELECT 6, 'A' FROM DUAL UNION ALL
SELECT 7, 'A' FROM DUAL UNION ALL
SELECT 7, 'B' FROM DUAL;
SELECT service,
       COUNT( userid ) AS num_users
FROM   (
  SELECT userid,
         LISTAGG( service ) WITHIN GROUP ( ORDER BY service ) AS service
  FROM   some_table
  GROUP BY userid
)
GROUP BY service;
SERVICE  NUM_USERS
------- ----------
AC               1 
A                3 
AB               3 
VARIABLE cur REFCURSOR;

DECLARE
  TYPE string_table IS TABLE OF VARCHAR2(4000);
  TYPE int_table IS TABLE OF INT;
  t_services string_table;
  t_counts   int_table;
  p_sql      CLOB;
BEGIN
  SELECT service,
         COUNT( userid ) AS num_users
  BULK COLLECT INTO t_services, t_counts
  FROM   (
    SELECT userid,
           CAST( LISTAGG( service ) WITHIN GROUP ( ORDER BY service ) AS VARCHAR2(2) ) AS service
    FROM   some_table
    GROUP BY userid
  )
  GROUP BY service;

  p_sql := EMPTY_CLOB() || 'SELECT ';
  p_sql := p_sql || t_counts(1) || ' AS "' || t_services(1) || '"';
  FOR i IN 2 .. t_services.COUNT LOOP
    p_sql := p_sql || ', ' || t_counts(i) || ' AS "' || t_services(i) || '"';
  END LOOP;
  p_sql := p_sql || ' FROM DUAL';

  OPEN :cur FOR p_sql;
END;
/

PRINT cur;
AC  A   AB
--- --- ---
1   3   3  
输出

CREATE TABLE some_table ( USERID, SERVICE ) AS
SELECT 1, 'A' FROM DUAL UNION ALL
SELECT 1, 'B' FROM DUAL UNION ALL
SELECT 2, 'A' FROM DUAL UNION ALL
SELECT 3, 'A' FROM DUAL UNION ALL
SELECT 3, 'B' FROM DUAL UNION ALL
SELECT 4, 'A' FROM DUAL UNION ALL
SELECT 4, 'C' FROM DUAL UNION ALL
SELECT 5, 'A' FROM DUAL UNION ALL
SELECT 6, 'A' FROM DUAL UNION ALL
SELECT 7, 'A' FROM DUAL UNION ALL
SELECT 7, 'B' FROM DUAL;
SELECT service,
       COUNT( userid ) AS num_users
FROM   (
  SELECT userid,
         LISTAGG( service ) WITHIN GROUP ( ORDER BY service ) AS service
  FROM   some_table
  GROUP BY userid
)
GROUP BY service;
SERVICE  NUM_USERS
------- ----------
AC               1 
A                3 
AB               3 
VARIABLE cur REFCURSOR;

DECLARE
  TYPE string_table IS TABLE OF VARCHAR2(4000);
  TYPE int_table IS TABLE OF INT;
  t_services string_table;
  t_counts   int_table;
  p_sql      CLOB;
BEGIN
  SELECT service,
         COUNT( userid ) AS num_users
  BULK COLLECT INTO t_services, t_counts
  FROM   (
    SELECT userid,
           CAST( LISTAGG( service ) WITHIN GROUP ( ORDER BY service ) AS VARCHAR2(2) ) AS service
    FROM   some_table
    GROUP BY userid
  )
  GROUP BY service;

  p_sql := EMPTY_CLOB() || 'SELECT ';
  p_sql := p_sql || t_counts(1) || ' AS "' || t_services(1) || '"';
  FOR i IN 2 .. t_services.COUNT LOOP
    p_sql := p_sql || ', ' || t_counts(i) || ' AS "' || t_services(i) || '"';
  END LOOP;
  p_sql := p_sql || ' FROM DUAL';

  OPEN :cur FOR p_sql;
END;
/

PRINT cur;
AC  A   AB
--- --- ---
1   3   3  

不要将其输出为动态列(如果不使用PL/SQL和动态SQL,很难做到),而是将其输出为行(如果您有前端,那么它通常可以比oracle更容易地将行转换为列):

Oracle安装程序

CREATE TABLE some_table ( USERID, SERVICE ) AS
SELECT 1, 'A' FROM DUAL UNION ALL
SELECT 1, 'B' FROM DUAL UNION ALL
SELECT 2, 'A' FROM DUAL UNION ALL
SELECT 3, 'A' FROM DUAL UNION ALL
SELECT 3, 'B' FROM DUAL UNION ALL
SELECT 4, 'A' FROM DUAL UNION ALL
SELECT 4, 'C' FROM DUAL UNION ALL
SELECT 5, 'A' FROM DUAL UNION ALL
SELECT 6, 'A' FROM DUAL UNION ALL
SELECT 7, 'A' FROM DUAL UNION ALL
SELECT 7, 'B' FROM DUAL;
SELECT service,
       COUNT( userid ) AS num_users
FROM   (
  SELECT userid,
         LISTAGG( service ) WITHIN GROUP ( ORDER BY service ) AS service
  FROM   some_table
  GROUP BY userid
)
GROUP BY service;
SERVICE  NUM_USERS
------- ----------
AC               1 
A                3 
AB               3 
VARIABLE cur REFCURSOR;

DECLARE
  TYPE string_table IS TABLE OF VARCHAR2(4000);
  TYPE int_table IS TABLE OF INT;
  t_services string_table;
  t_counts   int_table;
  p_sql      CLOB;
BEGIN
  SELECT service,
         COUNT( userid ) AS num_users
  BULK COLLECT INTO t_services, t_counts
  FROM   (
    SELECT userid,
           CAST( LISTAGG( service ) WITHIN GROUP ( ORDER BY service ) AS VARCHAR2(2) ) AS service
    FROM   some_table
    GROUP BY userid
  )
  GROUP BY service;

  p_sql := EMPTY_CLOB() || 'SELECT ';
  p_sql := p_sql || t_counts(1) || ' AS "' || t_services(1) || '"';
  FOR i IN 2 .. t_services.COUNT LOOP
    p_sql := p_sql || ', ' || t_counts(i) || ' AS "' || t_services(i) || '"';
  END LOOP;
  p_sql := p_sql || ' FROM DUAL';

  OPEN :cur FOR p_sql;
END;
/

PRINT cur;
AC  A   AB
--- --- ---
1   3   3  
查询

CREATE TABLE some_table ( USERID, SERVICE ) AS
SELECT 1, 'A' FROM DUAL UNION ALL
SELECT 1, 'B' FROM DUAL UNION ALL
SELECT 2, 'A' FROM DUAL UNION ALL
SELECT 3, 'A' FROM DUAL UNION ALL
SELECT 3, 'B' FROM DUAL UNION ALL
SELECT 4, 'A' FROM DUAL UNION ALL
SELECT 4, 'C' FROM DUAL UNION ALL
SELECT 5, 'A' FROM DUAL UNION ALL
SELECT 6, 'A' FROM DUAL UNION ALL
SELECT 7, 'A' FROM DUAL UNION ALL
SELECT 7, 'B' FROM DUAL;
SELECT service,
       COUNT( userid ) AS num_users
FROM   (
  SELECT userid,
         LISTAGG( service ) WITHIN GROUP ( ORDER BY service ) AS service
  FROM   some_table
  GROUP BY userid
)
GROUP BY service;
SERVICE  NUM_USERS
------- ----------
AC               1 
A                3 
AB               3 
VARIABLE cur REFCURSOR;

DECLARE
  TYPE string_table IS TABLE OF VARCHAR2(4000);
  TYPE int_table IS TABLE OF INT;
  t_services string_table;
  t_counts   int_table;
  p_sql      CLOB;
BEGIN
  SELECT service,
         COUNT( userid ) AS num_users
  BULK COLLECT INTO t_services, t_counts
  FROM   (
    SELECT userid,
           CAST( LISTAGG( service ) WITHIN GROUP ( ORDER BY service ) AS VARCHAR2(2) ) AS service
    FROM   some_table
    GROUP BY userid
  )
  GROUP BY service;

  p_sql := EMPTY_CLOB() || 'SELECT ';
  p_sql := p_sql || t_counts(1) || ' AS "' || t_services(1) || '"';
  FOR i IN 2 .. t_services.COUNT LOOP
    p_sql := p_sql || ', ' || t_counts(i) || ' AS "' || t_services(i) || '"';
  END LOOP;
  p_sql := p_sql || ' FROM DUAL';

  OPEN :cur FOR p_sql;
END;
/

PRINT cur;
AC  A   AB
--- --- ---
1   3   3  
输出

CREATE TABLE some_table ( USERID, SERVICE ) AS
SELECT 1, 'A' FROM DUAL UNION ALL
SELECT 1, 'B' FROM DUAL UNION ALL
SELECT 2, 'A' FROM DUAL UNION ALL
SELECT 3, 'A' FROM DUAL UNION ALL
SELECT 3, 'B' FROM DUAL UNION ALL
SELECT 4, 'A' FROM DUAL UNION ALL
SELECT 4, 'C' FROM DUAL UNION ALL
SELECT 5, 'A' FROM DUAL UNION ALL
SELECT 6, 'A' FROM DUAL UNION ALL
SELECT 7, 'A' FROM DUAL UNION ALL
SELECT 7, 'B' FROM DUAL;
SELECT service,
       COUNT( userid ) AS num_users
FROM   (
  SELECT userid,
         LISTAGG( service ) WITHIN GROUP ( ORDER BY service ) AS service
  FROM   some_table
  GROUP BY userid
)
GROUP BY service;
SERVICE  NUM_USERS
------- ----------
AC               1 
A                3 
AB               3 
VARIABLE cur REFCURSOR;

DECLARE
  TYPE string_table IS TABLE OF VARCHAR2(4000);
  TYPE int_table IS TABLE OF INT;
  t_services string_table;
  t_counts   int_table;
  p_sql      CLOB;
BEGIN
  SELECT service,
         COUNT( userid ) AS num_users
  BULK COLLECT INTO t_services, t_counts
  FROM   (
    SELECT userid,
           CAST( LISTAGG( service ) WITHIN GROUP ( ORDER BY service ) AS VARCHAR2(2) ) AS service
    FROM   some_table
    GROUP BY userid
  )
  GROUP BY service;

  p_sql := EMPTY_CLOB() || 'SELECT ';
  p_sql := p_sql || t_counts(1) || ' AS "' || t_services(1) || '"';
  FOR i IN 2 .. t_services.COUNT LOOP
    p_sql := p_sql || ', ' || t_counts(i) || ' AS "' || t_services(i) || '"';
  END LOOP;
  p_sql := p_sql || ' FROM DUAL';

  OPEN :cur FOR p_sql;
END;
/

PRINT cur;
AC  A   AB
--- --- ---
1   3   3  
动态列的PL/SQL

CREATE TABLE some_table ( USERID, SERVICE ) AS
SELECT 1, 'A' FROM DUAL UNION ALL
SELECT 1, 'B' FROM DUAL UNION ALL
SELECT 2, 'A' FROM DUAL UNION ALL
SELECT 3, 'A' FROM DUAL UNION ALL
SELECT 3, 'B' FROM DUAL UNION ALL
SELECT 4, 'A' FROM DUAL UNION ALL
SELECT 4, 'C' FROM DUAL UNION ALL
SELECT 5, 'A' FROM DUAL UNION ALL
SELECT 6, 'A' FROM DUAL UNION ALL
SELECT 7, 'A' FROM DUAL UNION ALL
SELECT 7, 'B' FROM DUAL;
SELECT service,
       COUNT( userid ) AS num_users
FROM   (
  SELECT userid,
         LISTAGG( service ) WITHIN GROUP ( ORDER BY service ) AS service
  FROM   some_table
  GROUP BY userid
)
GROUP BY service;
SERVICE  NUM_USERS
------- ----------
AC               1 
A                3 
AB               3 
VARIABLE cur REFCURSOR;

DECLARE
  TYPE string_table IS TABLE OF VARCHAR2(4000);
  TYPE int_table IS TABLE OF INT;
  t_services string_table;
  t_counts   int_table;
  p_sql      CLOB;
BEGIN
  SELECT service,
         COUNT( userid ) AS num_users
  BULK COLLECT INTO t_services, t_counts
  FROM   (
    SELECT userid,
           CAST( LISTAGG( service ) WITHIN GROUP ( ORDER BY service ) AS VARCHAR2(2) ) AS service
    FROM   some_table
    GROUP BY userid
  )
  GROUP BY service;

  p_sql := EMPTY_CLOB() || 'SELECT ';
  p_sql := p_sql || t_counts(1) || ' AS "' || t_services(1) || '"';
  FOR i IN 2 .. t_services.COUNT LOOP
    p_sql := p_sql || ', ' || t_counts(i) || ' AS "' || t_services(i) || '"';
  END LOOP;
  p_sql := p_sql || ' FROM DUAL';

  OPEN :cur FOR p_sql;
END;
/

PRINT cur;
AC  A   AB
--- --- ---
1   3   3  
输出

CREATE TABLE some_table ( USERID, SERVICE ) AS
SELECT 1, 'A' FROM DUAL UNION ALL
SELECT 1, 'B' FROM DUAL UNION ALL
SELECT 2, 'A' FROM DUAL UNION ALL
SELECT 3, 'A' FROM DUAL UNION ALL
SELECT 3, 'B' FROM DUAL UNION ALL
SELECT 4, 'A' FROM DUAL UNION ALL
SELECT 4, 'C' FROM DUAL UNION ALL
SELECT 5, 'A' FROM DUAL UNION ALL
SELECT 6, 'A' FROM DUAL UNION ALL
SELECT 7, 'A' FROM DUAL UNION ALL
SELECT 7, 'B' FROM DUAL;
SELECT service,
       COUNT( userid ) AS num_users
FROM   (
  SELECT userid,
         LISTAGG( service ) WITHIN GROUP ( ORDER BY service ) AS service
  FROM   some_table
  GROUP BY userid
)
GROUP BY service;
SERVICE  NUM_USERS
------- ----------
AC               1 
A                3 
AB               3 
VARIABLE cur REFCURSOR;

DECLARE
  TYPE string_table IS TABLE OF VARCHAR2(4000);
  TYPE int_table IS TABLE OF INT;
  t_services string_table;
  t_counts   int_table;
  p_sql      CLOB;
BEGIN
  SELECT service,
         COUNT( userid ) AS num_users
  BULK COLLECT INTO t_services, t_counts
  FROM   (
    SELECT userid,
           CAST( LISTAGG( service ) WITHIN GROUP ( ORDER BY service ) AS VARCHAR2(2) ) AS service
    FROM   some_table
    GROUP BY userid
  )
  GROUP BY service;

  p_sql := EMPTY_CLOB() || 'SELECT ';
  p_sql := p_sql || t_counts(1) || ' AS "' || t_services(1) || '"';
  FOR i IN 2 .. t_services.COUNT LOOP
    p_sql := p_sql || ', ' || t_counts(i) || ' AS "' || t_services(i) || '"';
  END LOOP;
  p_sql := p_sql || ' FROM DUAL';

  OPEN :cur FOR p_sql;
END;
/

PRINT cur;
AC  A   AB
--- --- ---
1   3   3  

你有一套可能的组合吗?也就是说,您是否提前知道查询将返回多少列?如果不是,你不能用一个简单的查询来完成它,但是你需要一些动态的东西(然后很难处理一个列数未知的结果集)。我知道哪些服务是可用的,例如一个人可以拥有10个服务。因此,有可能进行计算,并发现有10个!不同服务组合的数量,这是一个巨大的数字。这就是最大列数。但大多数都有0个计数,问题是我不知道是哪一个,所以我需要全部计算。你有一组可能的组合吗?也就是说,您是否提前知道查询将返回多少列?如果不是,你不能用一个简单的查询来完成它,但是你需要一些动态的东西(然后很难处理一个列数未知的结果集)。我知道哪些服务是可用的,例如一个人可以拥有10个服务。因此,有可能进行计算,并发现有10个!不同服务组合的数量,这是一个巨大的数字。这就是最大列数。但是大多数都是0,问题是我不知道是哪一个,所以我需要全部计算。哇,谢谢你快速准确的回复,这正是我想要的!!!!哇,谢谢你快速准确的回复,这正是我想要的!!!!