gpt4 book ai didi

mysql - 使用 GROUP BY 时的复杂条件列

转载 作者:行者123 更新时间:2023-11-29 02:41:42 27 4
gpt4 key购买 nike

我这里有两个表:一对一关系的CustomerCompany。换句话说,Company 表有一个 PK customerid 列,它是引用 Customer 的 PK id 的外键。这意味着,如果 Company 表中有一条记录,那么对应的客户就是一家公司。

下面是一个简化可视化图:

enter image description here

现在,当你想知道每个字母(代表客户名称或公司名称)在两个表中有多少客户和公司时,你可以执行以下查询:

SELECT LEFT(u.name, 1) AS letter, count(*) AS count FROM 
(
SELECT name,
CASE
WHEN (SELECT customerid FROM company WHERE company.customerid = id) THEN "Company"
ELSE "Customer"
END
AS origin
FROM customer
UNION ALL
SELECT companyname AS name, 'Company' AS origin FROM company
) AS u
GROUP BY letter
ORDER BY letter

然后得到如下结果集:

enter image description here

但是,我仍然需要在我的结果集中再生成一个列(例如“type”列),我可以在其中查看是否只有客户代表相应的字母、公司或两者。

这意味着:我需要这样的结果集:

letter | count | type
--------------------------
A 1 Companies
B 3 Both
C 2 Customers
<...>

是否可以通过实现条件列来实现?我已经尝试了很多不同的东西;每次都失败。


以防万一

以防万一您需要这个简化的 SQL 种子:

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

-- Table structure for table `company`
DROP TABLE IF EXISTS `company`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `company` (
`customerid` int(10) unsigned NOT NULL,
`companyname` varchar(45) NOT NULL,
PRIMARY KEY (`customerid`),
CONSTRAINT `fk_company$customerid` FOREIGN KEY (`customerid`) REFERENCES `customer` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

-- Dumping data for table `company`
LOCK TABLES `company` WRITE;
/*!40000 ALTER TABLE `company` DISABLE KEYS */;
INSERT INTO `company` VALUES (2,'Jane Solutions LLC'),(4,'Disney Company'),(5,'Bad Company');
/*!40000 ALTER TABLE `company` ENABLE KEYS */;
UNLOCK TABLES;

-- Table structure for table `customer`
DROP TABLE IF EXISTS `customer`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `customer` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(45) NOT NULL,
`pseudonym` varchar(25) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

-- Dumping data for table `customer`
LOCK TABLES `customer` WRITE;
/*!40000 ALTER TABLE `customer` DISABLE KEYS */;
INSERT INTO `customer` VALUES (1,'John Smith','John (NY)'),(2,'Jane Smith',NULL),(3,'John Smith','John (LA)'),(4,'Tom Smith',NULL),(5,'Alice Smith',NULL),(6,'Bob Smith',NULL),(7,'Benoit Smith',NULL),(8,'Craig Smith',NULL),(9,'Celine Smith',NULL);
/*!40000 ALTER TABLE `customer` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

最佳答案

您可以对计算的 origin 列使用条件聚合来进行检查:

SELECT
LEFT(u.name, 1) AS letter,
COUNT(*) AS count,
CASE WHEN COUNT(CASE WHEN origin = 'Company' THEN 1 END) > 0 AND
COUNT(CASE WHEN origin = 'Customer' THEN 1 END) > 0
THEN 'Both'
WHEN COUNT(CASE WHEN origin = 'Company' THEN 1 END) > 0
THEN 'Companies'
WHEN COUNT(CASE WHEN origin = 'Customer' THEN 1 END) > 0
THEN 'Customers' END AS type
FROM
(
SELECT name, 'Customer' AS origin FROM customer
UNION ALL
SELECT companyname, 'Company' FROM company
) t
GROUP BY letter
ORDER BY letter;

关于mysql - 使用 GROUP BY 时的复杂条件列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50540655/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com