【问题标题】:Combine two tables to display desired output组合两个表格以显示所需的输出
【发布时间】:2013-05-20 13:16:47
【问题描述】:

我正在创建一个查询,它将显示每月的预计数量与销售数量。下面是我的两张表,第三张是我想要的输出。这两个表几乎相同,只是日期和创建日期的格式不同(我已将其转换为输出,例如 201301,所以不用担心)。 正如您在我的输出表中注意到的那样,已售出的数量变为 25.00,因为如果日期属于同一月份和年份,它会添加数量。我还需要考虑这三个重要条件:

  1. 显示具有预计数量但没有销售额的行(例如项目 206)
  2. 显示没有预计数量但有销售额的行(例如项目 312)
  3. 显示带有投影和销售额的行(例如 item001 和 040)

我不知道我是否必须使用 join 或 union 才能实现我想要的输出。

表 A(销售表)

item     code          Sold       date
001       cust001      10.00     2013-01-20
001       cust001      15.00     2013-01-25 
040       cust045      16.00     2013-04-07
312       cust001      20.00     2013-03-13

表B(投影表)

item       Custcode    ProjectedQty       Creation Date
001        cust001     20.00              2013-01-01
040        cust045     50.00              2013-04-01
206        cust121     60.00              2013-04-01

输出

item       Custcode    sold     Date          ProjectedQty         Creation Date
001       cust001      25.00     201301         20.00                 201301
312       cust001      20.00     201303    null                   null
040        cust045    16.00     201304          50.00                 201304
206       cust121      null     null            60.00                 201304

感谢大家的帮助。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    试试

    SELECT COALESCE(p.item, s.item) item,
           COALESCE(p.code, s.code) code, 
           sold, 
           CONCAT(s.year, LPAD(s.month, 2, '0')) date, 
           ProjectedQty, 
           CONCAT(p.year, LPAD(p.month, 2, '0')) creationdate
    FROM 
    (
      SELECT item, code, YEAR(`date`) year, MONTH(`date`) month 
        FROM sales
       UNION
      SELECT item, custcode, YEAR(`creationdate`), MONTH(`creationdate`)
        FROM projection
    ) i LEFT JOIN
    (
      SELECT item, code, SUM(sold) sold, YEAR(`date`) year, MONTH(`date`) month
        FROM sales
       GROUP BY item, code, YEAR(`date`), MONTH(`date`)
    ) s ON i.item  = s.item 
       AND i.code  = s.code 
       AND i.year  = s.year 
       AND i.month = s.month LEFT JOIN 
    (
      SELECT item, custcode code, SUM(ProjectedQty) ProjectedQty, YEAR(`creationdate`) year, MONTH(`creationdate`) month
        FROM projection
       GROUP BY item, custcode, YEAR(`creationdate`), MONTH(`creationdate`)
    ) p ON i.item  = p.item 
       AND i.code  = p.code 
       AND i.year  = p.year 
       AND i.month = p.month
    ORDER BY code, item
    

    输出:

    | ITEM |    CODE |   SOLD |   DATE | PROJECTEDQTY | CREATIONDATE |
    ------------------------------------------------------------------
    |  001 | cust001 |     25 | 201301 |           20 |       201301 |
    |  312 | cust001 |     20 | 201303 |       (null) |       (null) |
    |  040 | cust045 |     16 | 201304 |           50 |       201304 |
    |  206 | cust121 | (null) | (null) |           60 |       201304 |
    

    SQLFiddle

    【讨论】:

      【解决方案2】:

      为什么不为此使用简单的join

      SELECT * FROM `sales`, `projection` WHERE `code`=`custcode`;
      

      查看上述查询,并使用WHERE 子句,您可以更改数据。

      【讨论】:

        【解决方案3】:

        使用联合创建视图。然后您可以使用以下查询:

        select *, sum(sold) as sold from view group by item
        

        另一个是:

        select *, sum(sold) from (
        select item,       code as Custcode,    sold,     date,          'ProjectedQty' as ProjectedQty,         'Creation Date' as Creation Date from table 1 union select item,       Custcode,    sold,     Date,          ProjectedQty,         Creation Date, from table 2) group by item
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-11-20
          • 2016-10-20
          • 2017-03-31
          • 1970-01-01
          • 1970-01-01
          • 2016-06-06
          • 2017-08-13
          相关资源
          最近更新 更多