下午好,
我对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
答案 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')