postgresql 按元组对多列排序

lsmd5eda  于 2022-12-03  发布在  PostgreSQL
关注(0)|答案(2)|浏览(133)

让我们假设我有一个塔布拉A喜欢:
| 双乙酰胆碱|双乙酸|双乙酸|渴望|
| - -|- -|- -|- -|
| X射线|Y形|Z形|10个|
| Y形|Z形|X射线|八个|
| Z形|Y形|X射线|六个|
| X射线|Y形|p值|二十个|
| 剩余|Y形|Z形|十三|
| X射线|的|Z形|一个|
| 一种|Y形|升|十二|
| 一种|X射线|k型|2个|
| X射线|p值|w型|一个|
我希望能够计算这些元素(x,y,z)中的任何一个在列(bisac 1,bisac 2,bisac 3)中出现的次数。
因此,前3行的预期结果应为3,后3行的预期结果应为2,最后3行的预期结果应为1。

n53p2ov0

n53p2ov01#

似乎下面应该按照你的要求去做了吧?

select 
    case when bisac1 in ('x','y','z') then 1 else 0 end +
    case when bisac2 in ('x','y','z') then 1 else 0 end +
    case when bisac3 in ('x','y','z') then 1 else 0 end 
from t;
zzoitvuj

zzoitvuj2#

您也可以使用每个字母一个大小写,而不是每列一个大小写(Stu的方法)。对于您的示例数据,结果*****将是相同的:

SELECT 
  CASE WHEN 'x' IN (bisac1, bisac2, bisac3) THEN 1 ELSE 0 END +
  CASE WHEN 'y' IN (bisac1, bisac2, bisac3) THEN 1 ELSE 0 END +
  CASE WHEN 'z' IN (bisac1, bisac2, bisac3) THEN 1 ELSE 0 END
FROM yourtable;

如果相同的字母出现在不同的列中,则结果***将不相同。例如,如果您的行如下所示:
| 双乙酰胆碱|双乙酸|双乙酸|
| - -|- -|- -|
| X射线|Y形|Y形|
然后Stu的查询将产生结果3,我的查询在这里是2。根据您的描述,我不清楚您的示例数据是否可以包含这样的行,或者这两个查询是否总是为您的数据创建相同的结果。
即使您的数据可以包括这样的行,我仍然不清楚您希望得到的结果是3还是2。
所以,总结一下,这里到底要用什么取决于你。

相关问题