我试图写一个查询,该查询将返回哪个服装在过去三个月中产生的收入与去年同期相比最多。 我想在一个表中显示结果。查询中的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
答案 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
。