【问题标题】:mysql return two columns based on same fieldmysql 根据同一字段返回两列
【发布时间】:2014-02-05 17:12:48
【问题描述】:
SELECT
(case when tableA.gender = 'Male' then tableB.X) as Male, 
(case when tableA.gender = 'Female' then tableB.X) as Female

...
FROM (MANY TABLES JOINT)
...

GROUP BY tableB.X
ORDER BY count(*) DESC

我试图通过查询另一列 (tableB.X) 是“男性”还是“女性”来基于一个字段 (column_name) 返回两列。我该怎么做呢?我仍然需要在 DESC 中为两列订购。谢谢。

每行返回一个值和一个性别(2 列)。我正在尝试根据性别将值拆分为两列,然后按每个拆分列按计数的降序显示..

即输入表:

value     Gender
-----     ------
AAA       Male
BBB       Female
AAA       Male
CCC       Male
AAA       Female
BBB       Female

即输出表:

Rank      Male      Female
----      ----      ------
 1        AAA       BBB          (AAA because it has 2 male occurences, BBB has 2 female occurences)
 2        CCC       AAA          (1 occurence each for male and female, ordered descending order)

我也不知道有多少不同的值,所以 SQL 必须为我计算。我可以使用两个查询获得结果,通过使用 WHERE 性别 = 男性和 WHERE 性别 = 女性,但我想知道我是否可以在一个查询中做到这一点。谢谢!

【问题讨论】:

  • 你到底想做什么?因为这目前没有意义。例如,如果我的表有 'Alice'、'Female' 和 'Bob'、'Male' - 您希望在这个 SELECT 的结果中包含哪些行?你会有一排男性='鲍勃'和女性='爱丽丝'吗?或者您是否希望有一行 Male='Bob' 和 Female=NULL,而另一行 Male=NULL 和 Female='Alice'?
  • 你能举一个你正在寻找的输出的例子吗?就像 PaF 说的,这目前还不是很清楚。
  • 由于您已将示例数据添加到您的问题中,我现在正在以不同的方式阅读您的问题。不过,我没有看到男性和女性列之间有任何联系。可以只选择所有男性,然后对他们进行排名,然后对所有女性重复同样的事情吗?结果不在一个表中,但可以单独修复。
  • 是的,我能做到 :) 我只是想知道是否可以使用 SQL 来完成

标签: mysql sql


【解决方案1】:

我认为UNION 声明可以实现类似的效果。但以下内容未经测试:

SELECT
tableB.X as Male,
'' as Female
FROM
...
tableB JOIN tableA
...
WHERE tableA.gender = 'male'

UNION

SELECT
'' as Male,
tableB.X as Female
FROM
...
tableB JOIN tableA
...
WHERE tableA.gender = 'female'

您也可以使用NULL,而不是空字符串''

【讨论】:

  • 它可以组合使用,但是否可以不包含任何空行?我想在它们被隔离后按每列的降序对它们进行排序..
  • 基于我上面的想法:SELECT id, Sum(Male), Sum(Female) FROM MY_STATEMENT_ABOVE GROUP BY id ORDER BY Male。您将不得不添加另一列(这里在内部语句中称为 id)并可​​能将 '' 替换为 0
猜你喜欢
  • 1970-01-01
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 2016-06-18
  • 2016-09-14
  • 1970-01-01
  • 1970-01-01
  • 2015-03-04
相关资源
最近更新 更多