-1

我有两个简单的表格设置:

table: deals
dealID   |   dealDate    | storeName
1        |   2013-04-01  | bayport
2        |   2013-04-01  | staten island
3        |   2013-04-04  | bayport



table: phoneDetails
phoneID    |   dealID    | dateReceived
1          |   1         | 2013-04-04
2          |   1         | 2013-04-04
3          |   2         | 2013-04-06
4          |   3         | 2013-04-05
5          |   3         | 2013-04-05

因此,基于此表,我需要查询我的数据库以显示交易日期以及每个商店在该日期收到的电话数量,或者甚至使用日历日期而不是交易日期也可以。例如:

dealDate    |  storeName     | Received
2013-04-01  |  bayport       | 0
2013-04-01  |  staten island | 0
2013-04-04  |  bayport       | 2

任何帮助,将不胜感激。我知道如何查询 dealDate 和 storeName,但我对如何子查询“Received”计数感到困惑,因为 dealDate 和 dateReceived 不同。

@echo_me,我该怎么做才能将结果更改为基于日历而不是交易日期的结果。看看我是如何在 4 月 6 日收到 1 部电话的,尽管那天没有交易

date       |  storeName      |  received
2013-04-01 |                 |  0
2013-04-02 |         |                          
2013-04-03 |                 |
2013-04-04 | bayport         |  2
2013-04-05 | bayport         |  1
2013-04-06 | staten island   |  1 
4

3 回答 3

1

我认为这将在您的示例中产生结果:

select d.dealDate dealDate, storeName, ifnull(count(*), 0) Received
from deals d
left join phoneDetails p on d.dealId = p.dealId and d.dealDate = p.dateReceived
group by dealDate, storeName

对于您要求的第二个结果,应该这样做:

select dateReceived date, storeName, count(*) received
from phoneDetails p
join deals using (dealId)
group by date, storeName
order by date

这不会显示没有收到任何内容的日期,您需要加入一个包含您关心的范围内所有日期的表,并且在 MySQL 中没有内置方法可以做到这一点(我认为 SQL-Server 或 Oracle可以做到)。有关使用所有日期填充临时表的方法,请参阅此问题,然后您可以将其与上述查询连接以生成所需的 0 行。

于 2013-04-10T18:41:06.747 回答
1

尝试这个

SELECT a.dealDate as dealDate, a.storeName as storeName, count(dateReceived) as Received
FROM deals a 
LEFT JOIN phoneDetails b 
ON a.dealDate = b.dateReceived
GROUP BY dealDate, storeName

在这里演示

于 2013-04-10T19:03:58.953 回答
0

如果您尝试以下操作,它将返回接收日期晚于交易日期的计数。

select a.dealDate as dealDate, a.storeName as storeName, b.dateReceived as dateReceived,  count(*) as counts
  from deals a left outer join phoneDetails b on a.dealId = b.dealId
 where b.dateReceived >= a.dealDate
 group by dealDate, storeName, dateReceived

这能让你得到你需要的吗?

于 2013-04-10T18:37:05.070 回答