【问题标题】:MySQL - Multiply column by value depending on that columnMySQL - 根据该列将列乘以值
【发布时间】:2013-09-19 18:30:56
【问题描述】:

我该如何写这个.. 我有一个表“公司”,其中有一列“大小”。大小引用枚举。当“大小”列是:

1 = 15
2 = 30
3 = 50
4 = 100
5 = 250

换句话说,我的表格将公司规模显示为 1、2、3、4 或 5。而 1 实际上是公司规模 15。

这是更大查询的一部分:

SELECT COUNT(DISTINCT(ID)) AS 'Total # of Opps', AVG(Size*?) AS 'AverageEstimatedCompanySize'
FROM persontable AS POJT INNER JOIN opportunity
ON POJT.ID = opportunity.id
WHERE opportunity.TimeStamp >= '2012-01-01' AND opportunity.TimeStamp <= '2012-12-31' AND POJT.JobTitleID IN 
    (SELECT Id
    FROM job
    WHERE CategoryID IN 
        (SELECT id
        FROM job_category
        WHERE name IN ('Sc', 'Ma', 'Co', 'En', 'Tr')))

【问题讨论】:

  • 这取决于您的应用程序。对于少量选择,简单的 CASE WHEN 块就足够了。大多数情况下,某种查找表是更好的解决方案。

标签: mysql sql linqpad


【解决方案1】:

听起来像是case statement 可以解决的问题。以下内容未经测试,但应为您指明正确的方向。

SELECT 
    COUNT(DISTINCT(ID)) AS 'Total # of Opps', 
    AVG(
        CASE Size
            WHEN 1 THEN 15
            WHEN 2 THEN 30
            WHEN 3 THEN 50
            WHEN 4 THEN 100
            WHEN 5 THEN 250
        END
    ) AS 'AverageEstimatedCompanySize'
FROM persontable AS POJT INNER JOIN opportunity
ON POJT.ID = opportunity.id
WHERE opportunity.TimeStamp >= '2012-01-01' AND opportunity.TimeStamp <= '2012-12-31' AND POJT.JobTitleID IN 
    (SELECT Id
    FROM job
    WHERE CategoryID IN 
        (SELECT id
        FROM job_category
        WHERE name IN ('Sc', 'Ma', 'Co', 'En', 'Tr')))

【讨论】:

  • 这些似乎有效,但是当我添加一个额外的 WHERE 子句时,即 WHERE Opp.CompType IN (0,5),并将其与替换的 WHERE 子句进行比较,即 WHERE Opp.CompType IN ( 1,2,3,4,6),平均公司规模保持不变?这让我相信这个 CASE 子句占用了所有公司规模,而不仅仅是那些属于现有 WHERE 子句(和子查询)的公司? - 确认,这需要每个公司规模,而不仅仅是那些属于 where 子句的公司
  • 你在哪里应用 where 子句?您确定它的位置实际上是以您想要的方式应用过滤吗?也许编辑您的问题以包含附加条款。
【解决方案2】:

我认为一种方法可能是将查询修改为JOINCompany 表(这是您需要解决的问题),然后修改AVG 语句:

... AVG(CASE `Size`
        WHEN 1 THEN 15
        WHEN 2 THEN 30
        WHEN 3 THEN 50
        WHEN 4 THEN 100
        WHEN 5 THEN 250 END) AS 'AverageEstimatedCompanySize'

其中Size 来自Company 表。

现在,一种更动态的方法是创建一个新字段,甚至是一个新表,它映射这些大小和 JOIN Company 表,并在查询中说出新表并获取适当的然后每行字段。这将摆脱 CASE 声明。

【讨论】:

    猜你喜欢
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 2018-12-14
    • 2023-03-22
    相关资源
    最近更新 更多