将单列SQL SELECT结果的列表转换为一行

4

我该如何表达以下陈述:

SELECT column1 FROM db WHERE country in ('USA','BRA','CHN') and commodity='pork'

返回

value1, value2, value3 (where value1 is for USA, value2 for BRA, value3 for CHN)

到目前为止,我得到的最好结果是一个单列,其中所有的值都按照从数据库中获取的方式呈现。

你希望得到什么输出? - My Other Me
9个回答

3

我做出了这样的假设,即你正在进行某种商品定价,并对商品/国家组合具有唯一约束。如果不是这种情况,您需要使用其他提供的JOIN答案之一。 - AvatarKava
我理解了你的错误,我的表述可能不够清晰。但是到目前为止,提供的解决方案都没有起作用。 - relima

2
以下是你可以做的事情:
Select a.column1,b.column2,c.column3 from
(SELECT column1 FROM db WHERE country ='USA' and commodity='pork') as a,
(SELECT column1 FROM db WHERE country ='BRA' and commodity='pork') as b,
(SELECT column1 FROM db WHERE country ='CHN' and commodity='pork') as c

我以为它能工作,但实际上我得到了SQLError:没有这样的列:b.column2。 - relima
如果我替换为a.column1,b.column1,c.column1,我会得到一个巨大的结果列表。似乎有些东西出了问题。 - relima
如果查询语句SELECT column1 FROM db WHERE country ='USA' and commodity='pork'返回多个结果,或者其他情况也很复杂,需要对表进行数据透视,如果您想让我这样做,我可以查一下如何操作。 - mariana soffer

1

这是一个演示问题。 让Python处理它更容易:

import sqlite3
conn = sqlite3.connect('/path/to/your.db')
curs = conn.cursor()
results = curs.execute("""SELECT column1 
                            FROM db 
                           WHERE country in ('USA','BRA','CHN') 
                             AND commodity='pork';""").fetchall()
', '.join(str(result[0]) for result in results)

虽然我通常会呼吁面向对象的程序员使用SQL进行集合操作,但这绝对是在程序中处理的情况! - James Anderson
@James Anderson: 为什么你不想在数据库中解决这个问题? - My Other Me
1
因为SQL解决方案不够优化!它们不能进行扩展,将国家代码硬编码在SQL中会成为从第一天开始的维护问题。使用简单的Python字典可以使SQL结果具备未来的适应性。 - James Anderson

1
使用 SQL Pivot。这会对你有所帮助。

0

类似这样:

SELECT column1 as value1 FROM db WHERE country='USA' and commodity='pork'
UNION
SELECT column1 as value2 FROM db WHERE country='BRA' and commodity='pork'
UNION
SELECT column1 as value3 FROM db WHERE country='CHN' and commodity='pork'

这与我已经拥有的东西完全相同:一个长列表的值。我想要将这些值并排放置,分为三列。 - relima
@relima:我的答案不起作用。Mariana Soffer 给出的答案是正确的。在 http://www.w3schools.com/Sql/sql_tryit.asp 上尝试一下 - "SELECT value1.ContactName, value2.ContactName FROM (SELECT ContactName FROM customers WHERE CompanyName='Centro comercial Moctezuma') as value1, (SELECT ContactName FROM customers WHERE CompanyName='The Big Cheese') as value2" - dalle
如果你的答案没有用或者对别人没有帮助,请删除它。 - Gilles 'SO- stop being evil'

0

这应该可以工作(在mysql中测试过)

SELECT GROUP_CONCAT(column1) FROM db WHERE country in ('USA','BRA','CHN') and commodity='pork'

我的测试是这样的(在mysql中)

SELECT GROUP_CONCAT( uid )  FROM pages where title in ('Home','Footer','home')

结果:

1,3,10

这是正确的。


0
   select max(case country
                 when 'USA' then column1
                 else null
               end) USA,
           max(case country
                 when 'BRA' then column1
                 else null
               end) BRA,
           max(case country
                 when 'CHN' then column1
                 else null
               end) CHN
    FROM db
    WHERE country in ('USA','BRA','CHN')
     and commodity='pork'

对数据进行一次单独的遍历(单个查询),并聚合三行,换句话说什么也没有。


0

我相信你正在寻找表格旋转的解决方案。我在这里回答了一个类似的问题。然而,我不熟悉SQLLite,所以可能会有所不同。


0
你想要这样的东西吗:
select 
  base.commodity
,USA_db.column1 as Commodity_USA
,BRA_db.column1 as Commodity_BRA
,CHN_db.column1 as Commodity_CHA
from (select 'pork' as commodity) as base
left join db as USA_db on base.commodity = USA_db.commodity and USA_db.country = 'USA'
left join db as BRA_db on base.commodity = BRA_db.commodity and BRA_db.country = 'BRA'
left join db as CHN_db on base.commodity = CHN_db.commodity and CHN_db.country = 'USA'
;

输出将是:

commodity   Commodity_USA  Commodity_BRA  Commodity_CHA
----------  -------------  -------------  -------------
pork        USA-pork       BRA-pork       USA-pork

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接