SQL在单个查询中为多个列选择COUNT

时间:2018-08-03 16:52:11

标签: sql select count

下午好,

我对SQL相对较新,并且对语言只有一定的了解,但是我的任务是创建一个表,该表提供在另一个表中使用的一组数据的摘要。具体来说,我正在处理一个看起来像这样的表(对表的格式表示歉意,因为我无法使其正确地垂直显示):

表1

Col1:a,b,c,d,a,d,b

Col2:狗,猫,狗,猫,马,鸟,猫

而且,我想使用SELECT COUNT在第一列中输出“ a”的唯一出现次数,然后在第二列中输出“ dog”的不重复出现次数(它们在我们正在工作的环境)。新的摘要表如下所示:

Col1(“ a”的个数):2

Col2(“狗的数量”):2

我的选择语句如下所示:

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个查询来获得所需的表?

谢谢!

Wyattburp86

3 个答案:

答案 0 :(得分:3)

如果您的sql平台支持CASE语句,则可以执行此操作。

<p>169</p>

上面的查询使用public static void main(String[] args) throws Exception { Example example = new Example(); example.startProxy(); } public void startProxy() throws UnknownHostException{ proxy = new BrowserMobProxyServer(); proxy.setTrustAllServers(true); proxy.start(0); Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy); String hostIp = Inet4Address.getLocalHost().getHostAddress(); seleniumProxy.setFtpProxy("localhost:"+ proxy.getPort()); seleniumProxy.setHttpProxy("localhost:"+ proxy.getPort()); DesiredCapabilities capabilities = new DesiredCapabilities(); // To Accept SSL certificate ChromeOptions options = new ChromeOptions(); //options.addArguments("--ignore-certificate-errors"); capabilities.setCapability(CapabilityType.PROXY, seleniumProxy); System.setProperty("webdriver.chrome.driver", "D:\\uap_workspace\\HTTPRequest\\src\\main\\resources\\executors\\drivers\\chromedriver.exe"); //set chromedriver system property driver = new ChromeDriver(capabilities); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); // enable more detailed HAR capture, if desired (see CaptureType for the complete list) proxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT, CaptureType.REQUEST_HEADERS, CaptureType.RESPONSE_HEADERS); // create a new HAR with the label "seleniumeasy.com" proxy.newHar("seleniumeasy.com"); // open seleniumeasy.com try{ driver.get("http://seleniumeasy.com"); }catch(Exception e){ e.printStackTrace(); } System.out.println("Navigate to selenium tutorials page"); driver.findElement(By.linkText("Selenium")); Har har = proxy.getHar(); // Write HAR Data in a File File harFile = new File(sFileName); try { har.writeTo(harFile); } catch (IOException ex) { System.out.println (ex.toString()); System.out.println("Could not find file " + sFileName); } if (driver != null) { proxy.stop(); driver.quit(); } } 而不是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" ,并且内部表达式返回0或1,具体取决于条件为假还是假。

答案 1 :(得分:0)

如果您完全可以控制所有需求,请进行更改。 SQL并非旨在按照您在此处需要的方式将行变成列。您可以做到这一点。您可能不应该

最好的选择是只运行两个不同的查询。这些都将被优化并快速运行,然后在您的软件中您可以弄清楚如何处理这两个结果。

下一个最佳选择:

SELECT SUM(IF(col1='a',1,0)) AS a, SUM(IF(col2='dog',1,0)) AS dog

(您的问题并没有标记特定的数据库引擎,所以我在这里采用了MySQL特定的解决方案,主要是因为它似乎最容易读为伪代码。如果您使用的是其他RDBMS,则代码看起来会有所不同,但会遵循相同的基本模式。)

答案 2 :(得分:0)

可以将两个选择作为另一个选择中的项组合。不优雅,但易于实现。

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')