【问题标题】:join one row to all row and returning all row将一行加入所有行并返回所有行
【发布时间】:2014-10-23 04:41:14
【问题描述】:

我可以从我的table 获得这样的数据吗

| id_outlet| date       |  count(msisdn) |  
| 34.10.1  |  2014-08   |      0         |
| 34.10.1  |  2014-09   |      3         |
| 34.10.1  |  2014-10   |      2         |
| 34.10.2  |  2014-08   |      1         |
| 34.10.2  |  2014-09   |      0         |
| 34.10.2  |  2014-10   |      0         |  

所以我有 2 张桌子
1. 餐桌插座(独特)
2. 餐桌销售(餐桌出口详情)
正如您在我的第二张表中看到的那样,有 3 个周期(2014-08、2014-09、2014-10)
我想像那个例子一样在第一个表中加入带有 id_outlet 的周期。
可以吗?
请帮帮我

【问题讨论】:

  • @JoachimIsaksson 我在我的链接中提供示例数据 >> sqlfiddle
  • @Barmar thx 编辑我的问题,我是新来的 :)
  • 你想达到什么目的?
  • @MichaelSivolobov :我必须像this 一样添加计数(msisdn)。如您所见,在表销售中有 3 个周期(2014-08、2014-09、2014-10),但并非所有 id_outlet 都有表销售数据。所以,我想显示 id_outlet、periode、count(msisdn)。例如:如果 id_outlet 在 2014-08 期间没有数据,则 count(msisdn) 应该为 0,等等。
  • 您可以编辑您的问题:-)“如果 id_outlet 在 2014-08 期间没有数据,则 count(msisdn) 应该为 0”。但是销售呢?是否有 2014-08 或您想从哪里检索日期?

标签: mysql jointable


【解决方案1】:

使用交叉连接:-

SELECT
    o.id_outlet,
    s_main.periode,
    o.branch, 
    count(msisdn)
FROM
(
    SELECT DISTINCT SUBSTRING(date,1,7) AS periode
    FROM sales
) s_main 
CROSS JOIN outlet o
LEFT OUTER JOIN sales s
ON s_main.periode = SUBSTRING(s.date,1,7)
AND o.id_outlet = s.id_outlet
WHERE (o.STATUS LIKE 'STREET%')
GROUP BY s_main.periode, o.branch, o.id_outlet

如果您有一个日期表,那么您可以只使用它而不是子查询来获取日期(这也避免了在一个月的销售额为零的情况下在结果中没有日期的潜在问题任何出口)。

【讨论】:

  • 这就是我想要的。谢谢这么多@kickstart,我在一天内想了想,但没有答案,你帮帮我。
  • 您的查询在 sqlfiddle 中运行良好,但如果我使用大量数据,它会花费很长时间。从你回答的时间开始到现在,结果还没有出现:(
  • 我建议添加一个日期表(即您感兴趣的月份和年份)并使用它而不是子查询。如果可能,还可以在包含月/年的销售表中添加一列。目前它必须对子查询(不使用索引)以及函数的结果(即SUBSTRING)进行连接,该函数也不会使用索引。
  • 如果我有日期表。我只是改变这个SELECT DISTINCT SUBSTRING(date,1,7) AS periode FROM sales 对吧?
  • 哦,我会考虑的。 thx before..如果我总是问你,不要无聊^_^
【解决方案2】:

别担心,开心就好!

SELECT
    o.id_outlet,
    SUBSTRING(s.date,1,7) AS periode,
    o.branch 
FROM outlet o LEFT JOIN sales s ON o.id_outlet = s.id_outlet
WHERE (o.STATUS LIKE 'STREET%')
ORDER BY o.id_outlet, YEAR(s.DATE), MONTH(s.DATE), branch

【讨论】:

  • 我要显示所有 id_outlet 和所有 periode 那么,我该怎么办?
  • 说吧,怎么把34.10.1解析成1呢?或者你想得到最新的点之后的那个数字吗?
  • 我想要这个数字 >> 34.10.1 ,在我的问题中,它只是一个示例。关键是我想显示所有 id_outlet 和 periode。
  • 如果我理解你,你必须使用'order by',而不是'group by'。作为'order BY o.id_outlet, YEAR(s.DATE), MONTH(s.DATE), branch'
  • 你不明白我的意思吗?我必须再次解释。所以,我想在表 1 中显示 1 个 id_outlet,在表 2 中显示所有日期。(对于每个 id_outlet 都有所有日期)
【解决方案3】:

你需要这个查询:

SELECT
    o.id_outlet,
    d.period AS periode,
    o.branch,
    count(msisdn)
FROM dates d LEFT JOIN outlet o ON d.period = SUBSTRING(o.date,1,7) LEFT JOIN sales s ON o.id_outlet = s.id_outlet
WHERE (o.STATUS LIKE 'STREET%')
GROUP BY CONCAT(d.period, '@', s.id_outlet)
ORDER BY o.id_outlet, d.period, branch

【讨论】:

  • 你试过我的fiddle我试过了,但是如果id_outlet在table sales中没有数据,那么它就不会出现:(
  • 但我也想显示count = 0。我可以这样做吗?
  • 如果您想要其他日期,您需要一张包含这些日期的表格。如果您从salesoutlet 检索您的日期,您总是会遇到这个日期已经存在一些数据的问题。我刚刚交换了salesoutlet。您可以更改订单。
  • 你的小提琴几乎完成了,先生。但每个 id_outlet 都没有周期。 :(
猜你喜欢
  • 2018-01-10
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
  • 2016-03-27
  • 2021-07-28
  • 1970-01-01
相关资源
最近更新 更多