Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 选择单个字段中Y与N的比率大于75%的不同值_Mysql - Fatal编程技术网

Mysql 选择单个字段中Y与N的比率大于75%的不同值

Mysql 选择单个字段中Y与N的比率大于75%的不同值,mysql,Mysql,我想从以下示例数据中选择Y与N之比等于或大于75%的不同建筑名称 CREATE TABLE Table1 (`UID` int, `Building Name` varchar(10), `Pets` varchar(1)); INSERT INTO Table1 (`UID`, `Building Name`, `Pets`) VALUES (1, 'Building A', 'Y'), (2, 'Building A', 'Y'), (3, 'Building A', 'Y'), (4,

我想从以下示例数据中选择Y与N之比等于或大于75%的不同建筑名称

CREATE TABLE Table1
(`UID` int, `Building Name` varchar(10), `Pets` varchar(1));

INSERT INTO Table1
(`UID`, `Building Name`, `Pets`) VALUES
(1, 'Building A', 'Y'),
(2, 'Building A', 'Y'),
(3, 'Building A', 'Y'),
(4, 'Building A', 'N'),
(5, 'Building B', 'Y'),
(6, 'Building B', 'Y'),
(7, 'Building B', 'N'),
(8, 'Building B', 'N'),
(9, 'Building C', 'N'),
(10, 'Building C', 'N'),
(11, 'Building C', 'Y'),
(12, 'Building C', 'Y'),
(13, 'Building C', 'N');

如果我正确理解了您的问题,您的查询可能如下所示:

SELECT t1.`Building Name`, ((t1.Y*100)/(t1.Y+t1.N)) AS Ratio
FROM (SELECT `Building Name`, SUM(CASE WHEN Pets = 'Y' THEN 1 ELSE 0 END) AS Y,
              SUM(CASE WHEN Pets = 'N' THEN 1 ELSE 0 END) AS N
     FROM Table1
     GROUP BY `Building Name`) AS t1
HAVING Ratio > 74
这里是为了看看它是如何工作的

德国劳埃德船级社

编辑 (基于胡安·卡洛斯·奥罗佩扎(Juan Carlos Oropeza)以下评论的建议)

这是给你的。

这是给你的


在MySQL中,如果你说
SUM(Pets='Y')
你会得到
Pets
列中值为
Y
的行数。这是因为布尔表达式的值为0(false)或1(true)

因此,您的查询是一个简单的聚合。()

如果您想要跨表服务器的可移植性,就不能依赖
SUM(boolean)
技巧。您需要()来代替这个查询

SELECT `Building name`, COUNT(*) cnt, SUM(CASE WHEN Pets = 'Y' THEN 1 ELSE 0 END) Pets ,
       100.0 * SUM(CASE WHEN Pets = 'Y' THEN 1 ELSE 0 END) / COUNT(*) percent
  from table1
  group by `Building name`
 having 100.0 * SUM(CASE WHEN Pets = 'Y' THEN 1 ELSE 0 END) / COUNT(*) >= 75.0 

这两者的表现大致相同;第二个稍微慢一点,但不会太多,因为它们必须查看相同数量的行(即所有行)。

下次您应该尝试创建小提琴。这样更容易理解问题。我尝试了sqlfiddle.com,他们现在有问题,我无法登录。理想的结果是在Pet字段中显示至少75%Y的所有建筑名称。在这种情况下,它只会是建筑A。现在我知道为什么我的小提琴计数器在变化了,它对我来说工作得很好。三个ppl同时工作。干得好,我喜欢你的方式。我有一个建议。您应该使用>=75,无需计算t1。“N”只需计算总数即可。@JuanCarlosOropeza是的,谢谢您的建议。我只是想给大家一个建议,怎么做,可能还有更多的微调要做。我现在没有太多时间考虑细节这是我读到这个问题时首先想到的。。。Ollie Jones在没有子查询的情况下做到了这一点,这可能更好:)是的,Ollie打败了我们两个,我甚至不知道MySql,所以试试普通的sql解决方案。你知道postgres或MsSQL中是否存在这个SUM(cond)吗?@JuanCarlosOropeza我知道你可以在MsSQL中使用这个语法SUM(CASE…),但不知道postgres。。。也许你可以谷歌一下,看看它是否存在。。GLIn在其他表服务器中,您必须说
SUM(如果Pets='Y'然后1 ELSE 0结束)
更详细一些。
SELECT 
      surveyYes.`Building Name`, 
      surveyYes.total, 
      surveyTotal.total, 
      surveyYes.total / surveyTotal.total as ratio
FROM 
(
  SELECT `Building Name`, `Pets`, count(*) as total
  FROM Table1
  WHERE `Pets` = 'Y'
  GROUP BY `Building Name`, `Pets`
) as surveyYes,
(
  SELECT `Building Name`, count(*) as total
  FROM Table1  
  GROUP BY `Building Name`
) as surveyTotal
WHERE
 surveyYes.`Building Name` =  surveyTotal.`Building Name`
AND (surveyYes.total / surveyTotal.total) >= 0.75
 SELECT `Building name`, COUNT(*) cnt, SUM(Pets = 'Y') Pets ,
       100.0 * SUM(Pets = 'Y') / COUNT(*) percent
  from table1
  group by `Building name`
 having 100.0 * SUM(Pets = 'Y') / COUNT(*) >= 75.0  
SELECT `Building name`, COUNT(*) cnt, SUM(CASE WHEN Pets = 'Y' THEN 1 ELSE 0 END) Pets ,
       100.0 * SUM(CASE WHEN Pets = 'Y' THEN 1 ELSE 0 END) / COUNT(*) percent
  from table1
  group by `Building name`
 having 100.0 * SUM(CASE WHEN Pets = 'Y' THEN 1 ELSE 0 END) / COUNT(*) >= 75.0