【问题标题】:mysql sub select newbiemysql子选择新手
【发布时间】:2012-08-09 04:29:59
【问题描述】:
SELECT a.lead_id, c.state_name AS COL1DATA, count( c.state_name ) AS leadcount, (

SELECT count( won_loss ) AS wonlosscount
FROM lead_status
WHERE (won_loss = 'loss')
AND lead_id = a.lead_id
) AS losscount
FROM lead AS a
JOIN states AS c ON a.state_id = c.states_id
GROUP BY c.state_name
ORDER BY losscount DESC

我得到的答案是

Lead_id COL1DATA 线索计数 losscount 1 昆士兰 7 0 8 维多利亚 3 0

线索状态

lead_id     won_loss    won_price   won_mainreason  loss_mainreason     loss_attachment_id  lost_dont_sell_note     add_note    dealer_satisfaction
      5     win         4655        pricing                                                                         fghfg       somewhat
      8     won         34543       pricing                                                                         sfdgs       satisfied
      7     loss                                    service                                                         Additional Notes    verygood
      9     loss                                    not_in_stock                                                    Additi      satisfied

但是损失计数应该是1和1

任何帮助都被appricated

【问题讨论】:

  • 可以发lead_status的内容吗?

标签: mysql select subquery


【解决方案1】:

我猜想在 state_name 分组的同时在相关查询中混合非聚合的lead_id 存在问题。或许你可以描述一下你希望得到什么。

编辑:基于下面评论中的 OP 反馈。

编辑 2: 更改为基于聊天会话的左外连接。并非所有潜在客户都有lead_status。

SELECT
    s.state_name AS COL1DATA, count(c.state_name) AS leadcount,
    sum(case when ls.won_loss = 'loss' then 1 else 0 end) as losscount
FROM
    lead AS l
    INNER JOIN states AS s ON s.state_id = l.states_id
    LEFT OUTER JOIN lead_status as ls on ls.lead_id = l.lead_id
GROUP BY s.state_name
ORDER BY losscount DESC

我可能会说这个版本稍微好一点。但我不想完全改变你的查询。 (我确实更改了别名,因为 A 和 C 令人困惑。)

SELECT
    min(s.state_name) AS COL1DATA,
    count(l.lead_id) AS leadcount, /* counting non-nullable key on the outer side */
    sum(case when ls.won_loss = 'loss' then 1 else 0 end) as losscount
FROM
    lead AS l
    INNER JOIN states AS s ON s.state_id = l.states_id
    LEFT OUTER JOIN lead_status as ls on ls.lead_id = l.lead_id
GROUP BY s.state_id /* might be better to group on the id */
ORDER BY losscount DESC

您在输出中包含的lead_id 列是不可预测的,除非该组只有一行。根据你所说的,我怀疑你真的想要它。

【讨论】:

  • 没问题。,.. 我想找回的是每个州的潜在客户总数和每个州丢失的潜在客户数量见 John woo 给出的答案...他似乎到达那里但还没有到达那里......
  • shawn:总潜在客户数显示为总数 won_loss .... 例如,我可以有 10 个潜在客户,但只有 2 个赢得或 3 个失败,所以潜在客户计数应该是 10 个损失计数3
  • 显然我们无法在没有看到一些数据的情况下猜测最终数字。 count(l.lead_id) 表达式将计算每组的行数,而不考虑 won_loss 值。
  • 显示它现在不这样做......如果我的损失总数 =2(比如状态 1 损失 = 1 和状态 2 损失 = 1)总潜在客户显示为(潜在客户数) = 2
  • @NMFSDF 我不确定我是否遵循了这一点,但听起来要么没有足够的数据来显示全貌,要么您可能误解了这些数字。您给几个 cmets 的描述非常简单。你有可能遗漏了一个小细节吗?如果你把所有的表格数据都贴出来,我可以很快给你答复。
猜你喜欢
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多