我对SQL还比较陌生,对这种语言只掌握一些有用的知识,但我的任务是创建一个表,该表提供了我在另一个表中处理的一组数据的摘要。具体来说,我正在处理一个类似于这样的表(对于表的格式表示歉意,因为我无法让它垂直正确地显示):
表1
Col1: a,b,c,d,a,d,b
Col2:狗,猫,狗,猫,马,鸟,猫
而且,我希望使用SELECT COUNT输出一列中"a“的唯一出现次数,然后输出第二列中唯一出现的”狗“的次数(它们在我们正在工作的环境中不相互依赖)。新的汇总表如下所示:
Col1 (“a”#):2
Col2 (“狗#”):2
我的select语句如下所示:
SELECT COUNT (Col1) as '# of a' FROM "Table 1" WHERE Col1 = 'a' 这是第二栏:
SELECT COUNT (Col2) as '# of dogs' FROM "Table 1" WHERE Col2 = 'dog'如何组合两个SELECT COUNT查询以获得所需的表?
发布于 2018-08-03 16:55:40
如果sql平台支持CASE语句,则可以这样做。
SELECT SUM(CASE WHEN Col1 = 'a' THEN 1 ELSE 0 END) as '# of a'
, SUM(CASE WHEN Col2 = 'dog' THEN 1 ELSE 0 END) as '# of dogs'
FROM "Table 1"上面的查询使用SUM而不是COUNT,内部表达式返回0或1,这取决于条件的计算结果是false还是true。
发布于 2018-08-03 16:57:37
可以将两个select合并为另一个select中的项。不优雅,但易于实现。
Select
cntA = (SELECT COUNT (Col1) as '# of a' FROM "Table 1" WHERE Col1 = 'a' )
, cntDog = (SELECT COUNT (Col2) as '# of dogs' FROM "Table 1" WHERE Col2 = 'dog')发布于 2018-08-03 16:56:59
如果您对需求有任何控制,请更改它们。SQL的设计并不是为了按照这里所需的方式将行转换为列。你可以的。你可能就是不应该。
最好的选择是只运行两个不同的查询。它们都将被优化并快速运行,然后在您的软件中您可以知道如何处理这两个结果。
其次是最好的选择:
SELECT SUM(IF(col1='a',1,0)) AS a, SUM(IF(col2='dog',1,0)) AS dog(您的问题没有标记特定的数据库引擎,所以我在这里使用了一个MySQL特定的解决方案,主要是因为它看起来很容易读成伪代码。如果您使用的是不同的RDBMS,代码看起来会不一样,但将遵循相同的基本模式。)
https://stackoverflow.com/questions/51677040
复制相似问题