在一个表中显示两个类似的查询

时间:2017-04-19 08:48:38

标签: mysql

我试图写一个查询,该查询将返回哪个服装在过去三个月中产生的收入与去年同期相比最多。 我想在一个表中显示结果。查询中的garment_id可能匹配但可能不匹配。如果它匹配,那么我想在同一行显示结果。我想我想通过garment_id订购。

到目前为止,我已经提出了几乎可以工作但却返回TotalDaysHired,MoneyIn,LastYrTotalDaysHired和LastYrMoneyIn的错误/奇怪值;我不知道为什么。我也试过通过a.garmentid = b.garmentid命令将这两个查询加入到a.garmentid = b.garmentid命令中,该命令甚至不会运行。

SELECT garment_hire_line.date_out as 'dateout', 
        garment_hire_line.garment_id as 'garmentid', 
        catalogue.description as 'description', 
        SUM(garment_hire_line.days) AS 'TotalDaysHired', 
        SUM(garment_hire_line.days*catalogue.daily_rate) AS 'MoneyIn', 
        '' as 'LastYrTotalDaysHired', 
        '' as 'LastYrMoneyIn'
FROM garment_hire_line
    INNER JOIN garment ON garment_hire_line.garment_id = garment.garment_id
    INNER JOIN catalogue ON garment.catalogue_id = catalogue.catalogue_id
WHERE garment_hire_line.date_out>DATE_SUB(NOW(),INTERVAL 3 MONTH)
GROUP by garment_hire_line.garment_id
UNION
SELECT garment_hire_line.date_out as 'dateout', 
        garment_hire_line.garment_id as 'garmentid', 
        catalogue.description as 'description','' as 'TotalDaysHired',
         '' as 'MoneyIn', 
        SUM(garment_hire_line.days) AS 'LastYrTotalDaysHired', 
        SUM(garment_hire_line.days*catalogue.daily_rate) AS 'LastYrMoneyIn'
FROM garment_hire_line
    INNER JOIN garment ON garment_hire_line.garment_id = garment.garment_id
    INNER JOIN catalogue ON garment.catalogue_id = catalogue.catalogue_id
WHERE garment_hire_line.date_out<DATE_SUB(NOW(),INTERVAL 1 YEAR)
AND garment_hire_line.date_out>DATE_SUB(NOW(),INTERVAL '1:3' YEAR_MONTH)
GROUP by garment_hire_line.garment_id

garment_hire_line

garment_line_id date_out Days return_date discount hire_id garment_id
8               12/06/2012  4   16/06/2012  0          1        4
9               12/06/2012  5   17/06/2012  0          1        2
10              12/06/2012  4   16/06/2012  0          1        4
11              11/07/2012  3   14/07/2012  10         2        2
12              10/08/2012  3   13/08/2012  0          3        4
13              09/09/2012  2   11/09/2012  5          4        3
14              09/01/2017  3   12/09/2017  0          5        3

目录

catalogue_id|   description|     designer|    Type|    daily_rate|  supplier_name|  supplier_purchase_price|    date_purchased| quantity|
    1             Hat        Elizabeth Kate Accessory        3       Lids              25                         28/02/2017    3
    2             Dress      Calvin Klein   Designer Outfit 20       Glam              260                        12/05/2012    2
    3             Handbag        Gucci      Accessory        4       Hold On           200                        01/01/2017    4
    4             Witches Dress  null       Fancy Dress      12      Fancy Fred        74                         21/05/2012    7

服装

garment_id  Colour    sizing    catalogue_id    location_id supplier_id
1           Black     Medium           1           2           1
2           Black     10               2           2           2
3           Black     8                2           2           3
4           Black     0                3           2           4
5           Red       Child            4           2           1
6           Black     Medium           1           2           2
7           Black     10               2           2           3

1 个答案:

答案 0 :(得分:0)

主要问题是在SQL查询中,对于一些真正应该返回数值数据的字段,使用''。因此,您在同一列中获得了''和3.00的一些记录,这是数据类型中的冲突。这会导致一些不需要的转换,从而导致您看到的垃圾输出。

通过将''替换为null来解决此问题。

但您可能还想研究其他一些问题:

  • 当您按服装ID分组时,如果在同一时间段内多次租用特定服装,您无法控制第一列中显示的日期。 实际上,此查询在较新版本的MySql中无效(除非您设置了允许它的选项)并违反了标准SQL规则。因此,您应该从查询中删除该列,或者对其应用聚合函数(如MAX),或者按其分组。

  • 通过使用union,您不会真正利用并排显示两个时段:一个记录中的4个字段中的2个将始终为null。您可以在没有union的情况下执行此操作,并使用sum聚合函数中的表达式对您总结的内容进行过滤。

所以我建议这个查询:

SELECT      MAX(garment_hire_line.date_out) as `LastDateOut`, 
            garment_hire_line.garment_id as `garmentid`, 
            catalogue.description as `description`, 
            SUM(CASE WHEN garment_hire_line.date_out > DATE_SUB(NOW(),INTERVAL 3 MONTH)
                 THEN garment_hire_line.days
                 ELSE 0
            END) AS `TotalDaysHired`, 
            SUM(CASE WHEN garment_hire_line.date_out > DATE_SUB(NOW(),INTERVAL 3 MONTH)
                 THEN garment_hire_line.days*catalogue.daily_rate
                 ELSE 0
            END) AS `MoneyIn`, 
            SUM(CASE WHEN garment_hire_line.date_out <= DATE_SUB(NOW(),INTERVAL 3 MONTH)
                 THEN garment_hire_line.days
                 ELSE 0
            END) AS `LastYrTotalDaysHired`, 
            SUM(CASE WHEN garment_hire_line.date_out <= DATE_SUB(NOW(),INTERVAL 3 MONTH)
                 THEN garment_hire_line.days*catalogue.daily_rate
                 ELSE 0
            END) AS `LastYrMoneyIn` 
FROM        garment_hire_line
INNER JOIN  garment ON garment_hire_line.garment_id = garment.garment_id
INNER JOIN  catalogue ON garment.catalogue_id = catalogue.catalogue_id
WHERE       garment_hire_line.date_out > DATE_SUB(NOW(),INTERVAL 3 MONTH)
         OR (   garment_hire_line.date_out > DATE_SUB(NOW(),INTERVAL 15 MONTH)
            AND garment_hire_line.date_out < DATE_SUB(NOW(),INTERVAL 12 MONTH)
            )
GROUP BY    garment_hire_line.garment_id
ORDER BY    1

如果您希望每个日期都有单独的行,请删除MAX功能,但在garment_hire_line.date_out列表中添加GROUP BY