SQL根据主题计算发生次数

SQL根据主题计算发生次数,sql,oracle,pivot,jpql,Sql,Oracle,Pivot,Jpql,我发现很难说出我想要达到的目标。我有一张这样的桌子: user char --------- a | x a | y a | z b | x b | x b | y c | y c | y c | z 如何编写返回以下结果的查询 user x y z ------- a |1|1|1| b |2|1|0| c |0|2|1| 这些数字表示原始表中出现的字符数 编辑: chars值未知,因此解决方案不能局限于这些值。很抱歉没有早点提。我正在使用OracleDB,但计划使用JPQL来构造查询 s

我发现很难说出我想要达到的目标。我有一张这样的桌子:

user char
---------
a | x
a | y
a | z
b | x
b | x
b | y
c | y
c | y
c | z
如何编写返回以下结果的查询

user x y z
-------
a |1|1|1|
b |2|1|0|
c |0|2|1|
这些数字表示原始表中出现的字符数

编辑: chars值未知,因此解决方案不能局限于这些值。很抱歉没有早点提。我正在使用OracleDB,但计划使用JPQL来构造查询

select user,
    sum(case when char='x' then 1 else 0 end) as x,
    sum(case when char='y' then 1 else 0 end) as y,
    sum(case when char='z' then 1 else 0 end) as z
from thetable
group by user
或者,如果您不介意垂直堆叠,此解决方案将为您提供一个即使使用未知字符集也能工作的解决方案:

select user, char, count(*) as count
from thetable
group by user, char
这将为您提供:

user   char   count
a      x      1
a      y      1
a      z      1
b      x      2
如果您想水平地串出一组未知值(如在演示输出中),则需要进入动态查询。。。SQL标准不是为生成列数未知的输出而设计的。。。希望这是有帮助的

或者,如果您不介意垂直堆叠,此解决方案将为您提供一个即使使用未知字符集也能工作的解决方案:

select user, char, count(*) as count
from thetable
group by user, char
这将为您提供:

user   char   count
a      x      1
a      y      1
a      z      1
b      x      2

如果您想水平地串出一组未知值(如在演示输出中),则需要进入动态查询。。。SQL标准不是为生成列数未知的输出而设计的。。。希望这是有帮助的

另一个选项,使用
T-SQL PIVOT(SQL SERVER 2005+)

结果:

user        x           y           z
----------- ----------- ----------- -----------
a           1           1           1
b           2           1           0
c           0           2           1

(3 row(s) affected)
编辑ORACLE

您可以使用构建类似的透视表

棘手的部分是,您需要在([x]、[y]、[z]、…)语句中的
中使用正确的列名。在代码中构造SQL查询应该不会太难,从表中获取(
选择DISTINCT[char])并将其附加到基本查询中


另一个选项,使用
T-SQL PIVOT(SQL SERVER 2005+)

结果:

user        x           y           z
----------- ----------- ----------- -----------
a           1           1           1
b           2           1           0
c           0           2           1

(3 row(s) affected)
编辑ORACLE

您可以使用构建类似的透视表

棘手的部分是,您需要在([x]、[y]、[z]、…)
语句中的
中使用正确的列名。在代码中构造SQL查询应该不会太难,从表中获取(
选择DISTINCT[char])并将其附加到基本查询中


如果您不知道要透视的确切值,则需要执行一些过程性操作,或者使用动态sql(在匿名块中),或者使用XML(在11g中)

如果您想要XML方法,它将类似于:

with x as (
  select 'a' as usr, 'x' as val from dual
  union all
  select 'a' as usr, 'y' as val from dual
  union all
  select 'b' as usr, 'x' as val from dual
  union all
  select 'b' as usr, 'x' as val from dual
  union all
  select 'c' as usr, 'z' as val from dual
)
select * from x
pivot XML (count(val) as val_cnt for val in (ANY))
;
输出:

USR VAL_XML
a   <PivotSet><item><column name = "VAL">x</column><column name = "VAL_CNT">1</column></item><item><column name = "VAL">y</column><column name = "VAL_CNT">1</column></item></PivotSet>
b   <PivotSet><item><column name = "VAL">x</column><column name = "VAL_CNT">2</column></item></PivotSet>
c   <PivotSet><item><column name = "VAL">z</column><column name = "VAL_CNT">1</column></item></PivotSet>
USR VAL\u XML
a x1y1
b x2
cz1

希望这对您有所帮助

如果您不知道要透视的确切值,您可能需要执行一些程序性操作,或者使用动态sql(在匿名块中),或者使用XML(在11g中)

如果您想要XML方法,它将类似于:

with x as (
  select 'a' as usr, 'x' as val from dual
  union all
  select 'a' as usr, 'y' as val from dual
  union all
  select 'b' as usr, 'x' as val from dual
  union all
  select 'b' as usr, 'x' as val from dual
  union all
  select 'c' as usr, 'z' as val from dual
)
select * from x
pivot XML (count(val) as val_cnt for val in (ANY))
;
输出:

USR VAL_XML
a   <PivotSet><item><column name = "VAL">x</column><column name = "VAL_CNT">1</column></item><item><column name = "VAL">y</column><column name = "VAL_CNT">1</column></item></PivotSet>
b   <PivotSet><item><column name = "VAL">x</column><column name = "VAL_CNT">2</column></item></PivotSet>
c   <PivotSet><item><column name = "VAL">z</column><column name = "VAL_CNT">1</column></item></PivotSet>
USR VAL\u XML
a x1y1
b x2
cz1


希望这有帮助

您使用的数据库是什么?sql server?mysql?这是用于什么数据库平台?可能的
char
值限制为
x
y
z
,或者它们可以是任何字符?很抱歉没有提前提及,char值未知,因此可以是任何字符。在VLAN和OldProgrammer,我正在使用oracle DB,并将使用JPQL来构造查询,而不使用XML,不确定是否可以使用一组未知的值(假设您正在寻找纯SQL的解决方案)来透视您使用的是什么DB?sql server?mysql?这是用于什么数据库平台?可能的
char
值限制为
x
y
z
,或者它们可以是任何字符?很抱歉没有提前提及,char值未知,因此可以是任何字符。在VLAN和OldProgrammer,我正在使用oracle DB,并将使用JPQL构建查询,而不使用XML,不确定是否可以使用未知的值集(假设您正在寻找纯SQL的解决方案)进行透视,如果他有250个可能的char值呢?那么这应该在问题中提及。很抱歉,没有提前提及这一点,字符值未知,因此它可以是任何字符。您确实需要水平排列的结果吗?”因为即使有未知的值,也很容易垂直堆叠。对不起,我无法想象垂直堆叠的意思。你能给我举个例子看看它是什么样子吗?如果不是太牵强的话,我可能可以用Java对数据进行后期处理。如果他有250个可能的字符值呢?那么这应该在问题中提及。很抱歉没有早点提及,字符值未知,因此可以是任何字符。你肯定需要水平排列的结果吗?”因为即使有未知的值,也很容易垂直堆叠。对不起,我无法想象垂直堆叠的意思。你能给我举个例子看看它是什么样子吗?如果不太牵强的话,我可能可以用Java对数据进行后期处理。