首页 > 解决方案 > 我如何编写一个 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;

这给出了表格:

表格1

表 2

基本上,我想编写一个查询,它会返回一个包含 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 的那些工作人员的计数。

标签: mysqlsqldml

解决方案


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

推荐阅读