gpt4 book ai didi

php - MySQL查询 - 两行之间的差异

转载 作者:行者123 更新时间:2023-11-29 05:37:00 25 4
gpt4 key购买 nike

我需要一点帮助集思广益来解决一个问题。我有一个销售表,每个餐厅位置有两行(每天)。一排是上午销售,另一排是下午销售。 AM 销售实际上只是 AM 销售,但是,PM 销售是 AM 销售和 PM 销售的组合。因此,为了提取 PM 销售额,您必须从中减去 AM 销售额行。

---------------------------------------------------------
date | id | meridiem | daily_sales | cover_counts |
---------------------------------------------------------
2012-03-22 |103 | AM | 2956.32 | 175 |
2012-03-22 |103 | PM | 12124.62 | 484 |
---------------------------------------------------------

我有一个查询来计算每人平均预计午餐(来自 AM 销售),并且效果很好。它基本上是从过去 6 周的销售数据中提取前 4 周,然后取平均值。 (注意:人均平均数是用销售额除以封面计算得出的)。

$statement = "SELECT directory.location, ROUND((SUM(sales.daily_sales / sales.cover_counts) / 4), 2) AS lppa
FROM t_directory directory
LEFT JOIN t_sales sales
ON sales.site_id = directory.site_id
AND DAYOFWEEK(sales.business_date) = DAYOFWEEK(:date1)
AND sales.business_date < DATE_SUB(:date2, INTERVAL 14 DAY)
AND sales.business_date >= DATE_SUB(:date3, INTERVAL 42 DAY)
AND sales.meridiem = 'AM'
WHERE directory.active = 1
GROUP BY directory.site_id
ORDER BY directory.site_id ASC
LIMIT :totalLocations";

$statementHandle = $this->dbHandle->prepare($statement);
$statementHandle->bindValue(':date1', $this->date, PDO::PARAM_STR);
$statementHandle->bindValue(':date2', $this->date, PDO::PARAM_STR);
$statementHandle->bindValue(':date3', $this->date, PDO::PARAM_STR);
$statementHandle->bindValue(':totalLocations', $this->totalLocations, PDO::PARAM_INT);
$statementHandle->execute();
$lppa = $statementHandle->fetchAll(PDO::FETCH_ASSOC);

现在我想计算平均每人的晚餐。为了做到这一点,我必须在进行任何数学计算之前分别从下午的销售额和封面中减去上午的销售额和封面。有没有一种简单的方法可以将这一切实现到一个查询中?我显然可以用 PHP 做到这一点,但我只是想知道如何在查询中完成这一点。任何帮助或见解将不胜感激。如果需要更多详细信息,请告诉我。

最佳答案

可以再次加入 t_sales,然后筛选“PM”

 SELECT DIRECTORY.location, 
Round(( SUM(salesPM.daily_sales - salesAM.daily_sales /
salesPM.cover_counts - salesAM.cover_counts) / 4 ), 2)
AS lppaPM
FROM t_directory DIRECTORY
LEFT JOIN t_sales salesAM
ON salesAM.site_id = DIRECTORY.site_id
AND Dayofweek(salesAM.business_date) = Dayofweek(:date1)
AND salesAM.business_date < DATE_SUB(:date2, INTERVAL 14 DAY)
AND salesAM.business_date >= DATE_SUB(:date3, INTERVAL 42 DAY)
AND salesAM.meridiem = 'AM'
LEFT JOIN t_sales salespm
ON salesAM.site_id = salesPM.site_id
AND salesAM.business_date = salesPM.business_date
AND salespm.meridiem = 'PM'
WHERE DIRECTORY.active = 1
GROUP BY DIRECTORY.site_id
ORDER BY DIRECTORY.site_id ASC
LIMIT :totalLocations

注意:此解决方案假设

  • {Site_ID, business_Date, meridiem} 是唯一的
  • 没有 AM 记录就没有 PM 记录
  • salesPM.cover_counts - salesAM.cover_counts 永远不会为零

关于php - MySQL查询 - 两行之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9827027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com