작년 같은 기간에 비해 지난 3 개월 동안 가장 많은 수익을 올린 의류를 반환하는 쿼리를 작성하려고합니다. 결과를 하나의 테이블에 표시하고 싶습니다. 쿼리의 clothing_id는 일치 할 수 있지만 일치하지 않을 수 있습니다. 일치하면 같은 행에 결과를 표시하고 싶습니다. 나는 clothing_id로 주문하고 싶다고 생각한다.
나는 지금까지 거의 작동하지만 TotalDaysHired, MoneyIn, LastYrTotalDaysHired 및 LastYrMoneyIn에 대해 잘못된 / 이상한 값을 반환하는 이것을 생각해 냈습니다. 왜 그런지 모르겠어요. 또한 실행되지 않을 a.garmentid에 의한 내부 조인 ON 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
clothing_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
주요 문제는 SQL 쿼리에서 ''
실제로 숫자 데이터를 반환해야하는 일부 필드에 사용한다는 것입니다. 따라서 ''
동일한 열에 및 3.00이있는 일부 레코드를 얻습니다 . 이는 데이터 유형의 충돌입니다. 이로 인해 원하지 않는 변환이 발생하여 가비지 출력이 표시됩니다.
이 문제 ''
를 null
.
그러나 다음과 같은 몇 가지 다른 문제를 살펴볼 수도 있습니다.
의류 ID별로 그룹화하면 특정 의류가 같은 기간에 여러 번 고용되었을 때 첫 번째 열에 표시되는 날짜를 제어 할 수 없습니다. 실제로이 쿼리는 MySql의 최신 버전에서 유효하지 않으며 (허용 옵션을 설정하지 않는 한) 표준 SQL 규칙을 위반합니다. 따라서 쿼리에서 해당 열을 제거하거나 집계 함수 (예 :)를 적용 MAX
하거나이를 기준으로 그룹화해야합니다.
를 사용 union
하면 두 마침표를 나란히 표시하는 것을 실제로 활용하지 못할 것 null
입니다. 한 레코드의 4 개 필드 중 2 개는 항상 . 이 작업을 수행하지 않고 집계 함수 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
목록에 추가 하십시오.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다