将满足其他几个列条件的列组合在一起

Posted

技术标签:

【中文标题】将满足其他几个列条件的列组合在一起【英文标题】:Group a column together where meets several other column conditions 【发布时间】:2014-09-19 19:23:05 【问题描述】:

我需要能够对一列(小时)求和,它与其他列中的多个条件相匹配。这可能是表格的样子。

payrollid, agentid, ptid, serviceid, dateincurred ,hours
209      , 284    , 580 , 1320     , '2014-05-19' ,4
209      , 284    , 569 , 1433     , '2014-45-19' ,2
209      , 284    , 580 , 1433     , '2014-05-19' ,2
209      , 284    , 569 , 1433     , '2014-05-19' ,2
209      , 284    , 580 , 1320     , '2014-05-19' ,7
209      , 284    , 580 ,   19     , '2014-05-20' ,1
209      , 284    , 569 , 1318     , '2014-45-21' ,2
209      , 284    , 580 , 1320     , '2014-45-22' ,1
209      , 284    , 580 ,   16     , '2014-05-23' ,1
209      , 284    , 569 , 1445     , '2014-45-24' ,9
209      , 284    , 580 , 1427     , '2014-05-25' ,1
209      , 284    , 569 , 1326     , '2014-05-28' ,1
209      , 284    , 569 , 1445     , '2014-45-29' ,4
209      , 284    , 569 , 1320     , '2014-05-29' ,1
209      , 284    , 569 , 1347     , '2014-45-29' ,5
209      , 284    , 580 , 1320     , '2014-05-30' ,1
209      , 284    , 569 , 1347     , '2014-05-30' ,5
209      , 284    , 580 , 1326     , '2014-05-31' ,1
209      , 284    , 580 , 1348     , '2014-06-01' ,1
209      , 284    , 580 ,   24     , '2014-06-01' ,1

查询如下图:

SELECT
    p.agentid,
    p.ptid,
    p.dateincurred,
    p.serviceid,

    (
    SELECT 
        GROUP_CONCAT(p.hours) 
    FROM payroll_detail_temp p3
    WHERE p3.payrollid = '209'
    AND (
            p3.dateincurred BETWEEN '2014-05-19'
            AND DATE_ADD('2014-05-19', INTERVAL 6 DAY))
            AND p3.serviceid = p.serviceid
            GROUP BY
                p3.serviceid
            LIMIT 1
        ) AS week1,

        (
        SELECT
            GROUP_CONCAT(p2.hours)
        FROM
            payroll_detail_temp p2
        WHERE
            p2.payrollid = '209'
        AND (
            p2.dateincurred BETWEEN '2014-05-25'
            AND DATE_ADD('2014-05-25', INTERVAL 6 DAY))
            AND p2.serviceid = p.serviceid
        GROUP BY
            p2.serviceid,
            p2.dateincurred
        LIMIT 1
    ) AS week2,
    GROUP_CONCAT(p.serviceid) AS services,
    GROUP_CONCAT(p.dateincurred) AS dates
FROM
    payroll_detail_temp p
    INNER JOIN agent ON (p.agentid = agent.id)
    INNER JOIN service ON (p.serviceid = service.id)
    INNER JOIN payer ON (p.payerid = payer.id)
    INNER JOIN prov ON (p.provid = prov.id)
    INNER JOIN patient ON (p.ptid = patient.id)
WHERE
    p.payrollid = '209'
    AND (
        p.dateincurred BETWEEN '2014-05-19'
        AND DATE_ADD('2014-05-25', INTERVAL 14 DAY)
    )
GROUP BY
    p.serviceid,
    p.dateincurred

Week1 和 Week2 列表示 2 周期间的工作小时数,在本例中,它设置为 2014-05-19 和 2014-06-01。因此,Week1 列将分组时间,其中 agentid、ptid、serviceid 匹配,并且发生的日期范围从 2014-05-19 到 2014-05-25。第 2 周也是如此,日期在 2014-05-26 到 2014-06-01 之间。

我的查询的问题是我得到了重复,就像下面查询结果中显示的最后两个结果一样。 Week1 应该有 9.00 并且 Week2 需要为空;同样,Week1 下方的行应为 null,Week2 应为 4.00。在第 5 行和第 6 行也可以看到相同的情况。在第 5 行,第 1 周应该是 7.00、4.00 和 1.00,第 2 周应该为空。第 6 行不应该存在。

我知道存在重复项,因为查询中的 dateincurred 字段重叠,但我想不出它周围的任何其他字段。

【问题讨论】:

【参考方案1】:

如果您有第一张图片所示的表格。然后您可以通过此查询轻松实现您想要的:

SELECT
 PAYROLLID,
 AGENTID,
 PTID,
 SERVICEID,
 DATEINCURED,
 CASE WHEN (DATEINCURRED BETWEEN '2014-05-19' AND '2014-05-25') THEN SUM(HOURS) END WEEK1,
 CASE WHEN (DATEINCURRED BETWEEN '2014-05-26' AND '2014-06-01') THEN SUM(HOURS) END WEEK2
FROM
 YOUR_TABLE_NAME
GROUP BY
PAYROLLID,
AGENTID;

【讨论】:

我必须按更多字段分组才能获得我想要的数据,但否则这会奏效!非常感谢。

以上是关于将满足其他几个列条件的列组合在一起的主要内容,如果未能解决你的问题,请参考以下文章

如何在其他几个列上添加一个权重列?

尝试为其他几个列的完整地址创建一个列,但在某些地址上遇到问题

如果满足某些条件,则从行中获取信息

如果使用 Or 关键字不满足条件

将递增值与其他值一起添加到 Oracle 数据库中的列中

如何将 SQL 中的 2 个表与 1 个公共列组合在一起,而其他列中没有关系?