mysql - 我如何编写一个 SQL 查询来给出一个值在表中重复的次数?
问题描述
所以我有两个我创建的表:
CREATE TABLE IF NOT EXISTS `Advertising_Campaign` (
`CampaignID` VARCHAR(10) NOT NULL,
`AdvertName` varchar(45) NOT NULL,
`ProjectLead` VARCHAR(10) NULL,
`CostEstimate` decimal NULL,
`CampaignCost` decimal NULL,
`EndDateEst` date NULL,
`StartDate` date NULL,
`EndDate` date NULL,
`Theme` VARCHAR(45) NOT NULL,
`AdvertType` VARCHAR(45) NOT NULL,
PRIMARY KEY (`CampaignID`))
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `staff_works_campaign` (
`CampaignID` VARCHAR(10) NOT NULL,
`StaffID` VARCHAR(10) NOT NULL,
`SalaryGrade` Integer NOT NULL,
`isSup` VARCHAR(3) NOT NULL,
PRIMARY KEY (`StaffID`, `CampaignID`),
CONSTRAINT `FK_StaffID3` FOREIGN KEY (`StaffID`) REFERENCES `Staff` (`StaffID`),
CONSTRAINT `FK_CampaignID2` FOREIGN KEY (`CampaignID`) REFERENCES `Advertising_Campaign` (`CampaignID`))
ENGINE = InnoDB;
这给出了表格:
基本上,我想编写一个查询,它会返回一个包含 2 名以上工作人员的 ads_campaign.AdvertName 列表,以及 staff_works_campaign.SalaryGrade 大于 2 的工作人员数量。
我试过了:
select a.advertname, count(*) as 'Greater Than 2'
from advertising_campaign a inner join staff_works_campaign
where staff_works_campaign.SalaryGrade > 2;
这不是我想要的,它返回:
我有点不确定这到底返回了什么,因为我认为它会返回 2 的计数(因为表中有 2 个 SalaryGrade 为 4 的条目),可能是因为内部的方式加入作品?
对于如何过滤“超过 2 名工作人员”,我也有点困惑,我的想法是查看 staff_works_campaign.CampaignID 出现在 staff_works_campaign 表中的次数,看看有多少工作人员是分开的活动。
我不知道如何构造它来计算campaignID 重复的次数,并返回具有2 个或更多工作人员的campaignID 的广告的名称。
因此,在这种情况下,我希望它返回一个包含 AdvertName 的表,其中仅包含那些有两个或更多人参与的活动,以及薪水等级大于 2 的那些工作人员的计数。
解决方案
SELECT
a.CampaignID
,a.AdvertName
,COUNT(DISTINCT s.StaffID) AS [Count of staff]
,SUM(
--Use this to get a total of the staff who are
--in a SalaryGrade greater than 2
CASE WHEN s.SalaryGrade > 2
THEN 1
ELSE 0 --anyone who is under this level will be a 0 and not count
END
) as [Count of staff above salary grade]
FROM
advertising_campaign AS a
INNER JOIN staff_works_campaign AS s
--dont forget the join condition
ON a.CampaignID = s.CampaignID
--Dont want a where here, we want to include ALL staff.
--WHERE
-- staff_works_campaign.SalaryGrade > 2
GROUP BY
a.CampaignID
,a.AdvertName
HAVING
--more than two members of staff working on the same campaign.
COUNT(DISTINCT s.StaffID) > 2
推荐阅读
- java - DiffCallBack 没有被调用?
- flutter - 通过flutter android安装一个apk
- reactjs - 如何使用 ReactJS 和 AmChart 将数据传递到状态
- javascript - 如何从下拉框中编写一个 For 循环来填充 JSON 文件中的第二个下拉框?
- git - 壁球历史但保留 X 个最近的提交
- sql - Micorosft Access SQL - 计算 3 个相关表中的外键记录数
- c++ - 了解虚拟派生类的大小
- python - 如何在计算验证指标之前编写自定义 Keras 验证以对多个图像切片进行平均预测
- angular - NGX-MQTT | 蚊子
- java - Maven(exec plugin) 不使用“/”字符解析项目路径