【问题标题】:check if a date exists within a grouped row and if it does then change column in sql检查分组行中是否存在日期,如果存在则更改 sql 中的列
【发布时间】:2017-05-10 15:07:12
【问题描述】:

我有一个数据库查询,将应付款项按月值分组。

我现在面临的问题是,我无法查看每一笔付款以确保全部付款。

列中的dp是付款日期。

如果列中的日期是 0000-00-00 00:00:00,则没有付款。

这里是查询:

$monthlyQuery = $pdo->prepare("
SELECT SUM(net) AS net
     , MONTH(dd) AS month
     , YEAR(dd) AS year
     , dp 
  FROM sin WHERE cpo=:cpo 
   AND dd >= :dd1 
   AND dd <= :dd2 
 GROUP 
    BY month 
 ORDER 
    BY dd ASC
 ");
$monthlyQuery->execute(array(':cpo' => $fetch['cpo'], ':dd1' => $janDate, ':dd2' => $decDate));
$monthlyQueryNum = $monthlyQuery->rowCount();

有没有办法在对行进行分组之前检查每个 dp 列,如果在任何时候日期是 0000-00-00 00:00:00,那么将该组的所有日期设为 0000-00-00 00:00 :00

我当时正在考虑做一个 CASE WHEN,但逻辑似乎对我不起作用。

谢谢

【问题讨论】:

标签: mysql sql if-statement pdo


【解决方案1】:

由于您没有向我们提供数据来测试这一点,我编写了以下内容但无法对其进行测试。它应该接近你想要的:

SELECT
    SUM(s.net) AS net
    ,MONTH(s.dd) AS month
    ,YEAR(s.dd) AS year
    ,COALESCE(missing.inner_dp,s.dp) AS dp 
FROM
    sin s
    LEFT JOIN
    (
    SELECT
        YEAR(s2.dd) AS inner_year
        ,MONTH(s2.dd) AS inner_month
        ,cpo AS inner_cpo
        ,dp AS inner_dp
    FROM
        sin s2
    WHERE
        s2.dp = '0000-00-00 00:00:00'
        AND s2.dd >= :dd1 
        AND s2.dd <= :dd2 
    GROUP BY
        inner_year, inner_month, inner_cpo, inner_dp
    ) AS missing ON
        YEAR(s.dd) = missing.inner_year
        AND MONTH(s.dd) = missing.inner_month
        AND s.cpo = missing.inner_cpo
WHERE
    s.cpo=:cpo 
    AND s.dd >= :dd1 
    AND s.dd <= :dd2 
GROUP BY
    year, month, dp
ORDER BY
    year, month, dp

我不喜欢 MySQL 允许“隐式”GROUP BY 表达式,我已经将它们明确化了。您会注意到我还更改了 ORDER BY,因为您认为我有问题。

【讨论】:

  • 这个答案有帮助吗,@Robert?热衷于了解任何一种方式,如果我们还没有完成,很乐意进一步互动。
  • 嗨@steve-lovell 不,它只是给出了与我最初得到的结果相同的结果。我决定只使用 1 个简单的 sql 查询,并简单地使用 php 多功能数组和一些简单的函数对它们进行排序。这要困难得多,老实说,它很可能没有 sql 查询那么高效,但这是我可以解决这个问题的唯一方法。无论如何谢谢:)
  • 嗯,我觉得我们缺少一些东西。您可以在问题中添加示例数据和预期输出吗?
猜你喜欢
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多