2

我在使用以下查询时遇到问题:

SELECT 
    job.name,
    job_element.label,
    job_element_role_hours.role,
    job_element_role_hours.hours_budgeted,
    latest_rate.hourly_rate,
    ( job_element_role_hours.hours_budgeted * latest_rate.hourly_rate ) AS line_cost
FROM
    job_element
    INNER JOIN job ON job_element.job = job.id
    INNER JOIN job_element_role_hours ON job_element_role_hours.element = job_element.id
    LEFT JOIN(
        SELECT 
            rate.*
        FROM
            rate
        LEFT JOIN rate AS newest ON (
            rate.role = newest.role
            AND COALESCE(rate.client_company, 1) = COALESCE(newest.client_company, 1)
            AND COALESCE(rate.client_group, 1) = COALESCE(newest.client_group, 1)
            AND COALESCE(rate.client_contact, 1) = COALESCE(newest.client_contact, 1)
            AND newest.date_from > rate.date_from
        )
        WHERE newest.id IS NULL
    ) AS latest_rate ON (
        latest_rate.role = job_element_role_hours.role
        AND (
            COALESCE(latest_rate.client_company, 1) = COALESCE(job.client_company, 1)
            OR latest_rate.client_company IS NULL
        )
        AND (
            COALESCE(latest_rate.client_group, 1) = COALESCE(job.client_group, 1)
            OR latest_rate.client_group IS NULL
        )
        AND (
            COALESCE(latest_rate.client_contact, 1) = COALESCE(job.client_contact, 1)
            OR latest_rate.client_contact IS NULL
        )

    )
WHERE job.id = 4

所以......这个查询获取一个作业的元素列表。每个元素都按“角色小时数”进行细分——例如,一个名为“构建 HTML 电子邮件”的元素可能有两个小时的设计师和两个小时的开发者——然后根据每个元素的小时费率计算成本角色。

问题是我将latest_rate子查询加入到主查询中。这是我的费率表:

'CREATE TABLE `rate` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `client_company` int(11) DEFAULT NULL,
  `client_group` int(11) DEFAULT NULL,
  `client_contact` int(11) DEFAULT NULL,
  `role` int(11) DEFAULT NULL,
  `date_from` datetime DEFAULT NULL,
  `hourly_rate` decimal(18,2) DEFAULT NULL,
  `last_edited_by` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
)

一个角色可能有多种费率:“全局”费率,其中设置了角色,但 client_company、client_group 和 client_contact 字段为 NULL;设置了角色和 client_company 但其他所有内容为 NULL 的公司特定费率,以及设置了角色、client_company 和 client_contact 但 client_group 为 NULL 的客户特定费率。

我想为“最接近”匹配为 Job 设置的 client_company、client_group 和 client_contact 的角色获得一个费率。因此,如果有一个设置了角色和 client_company 的 Rate 记录(并且 client_company 与 Job 匹配),我想要那个。否则,我将退回到带有 NULL client_company 的那个。

我的加入尝试显然是错误的:

AND (
     COALESCE(latest_rate.client_company, 1) = COALESCE(job.client_company, 1)
     OR latest_rate.client_company IS NULL
)

它将返回与 client_company 匹配或具有 NULL client_company 的所有记录。

我怎样才能得到它来获得最匹配的字段?

谢谢 :)

4

1 回答 1

2

您可以尝试使用一个查询,该查询基本上针对您绝对想要匹配的一个参数获取所有匹配率 - 似乎是role您的情况。

然后你可以做类似的事情:

MAX(
    CASE WHEN <conditions 1> THEN <calculation 1> END,
    CASE WHEN <conditions 2> THEN <calculation 2> END,
    ...
    )

这将为您提供可能的最大费率,即,如果您有最匹配的字段,则适用的费率。

于 2012-10-12T07:28:23.880 回答