2016-09-06 3 views
0

아래 코드가 있습니다. 날짜를 기준으로 행을 병합하려고합니다.이 결과를 한 행에 병합하는 방법

SELECT 

TICKETS.TICKETID, 
RECEIPTS.DATENEW, 
TAXCATEGORIES.NAME = 'GCT' as GCT, 
TAXCATEGORIES.NAME = 'Tax 25%' as Tax25, 
TAXLINES.AMOUNT, 

SUM(TAXLINES.AMOUNT) AS TOTAL, 
SUM(CASE WHEN taxcategories.NAME = 'GCT' THEN taxlines.AMOUNT ELSE 0 END) AS GCTTOTAL, 
SUM(CASE WHEN taxcategories.NAME = 'Tax 25%' THEN taxlines.AMOUNT ELSE 0 END) AS TAX25TOTAL 

    FROM 
    RECEIPTS, 
    TAXLINES, 
    TAXES, 
    TAXCATEGORIES, 
    TICKETS, 
    PAYMENTS 

    WHERE 
    PAYMENTS.RECEIPT = RECEIPTS.ID 
    AND RECEIPTS.ID = TAXLINES.RECEIPT 
    AND RECEIPTS.ID = TICKETS.ID 
    AND TAXLINES.TAXID = TAXES.ID 
    AND TAXES.CATEGORY = TAXCATEGORIES.ID 
    AND DATENEW >= '2016-07-14 00:00:00' AND DATENEW <= '2016-07-14 23:00:00' 


GROUP BY gct, Tax25, CAST(RECEIPTS.DATENEW AS DATE) 

쿼리의 결과는 아래의 스크린 샷에 부착되어 enter image description here

가 지금은 하나의 행에 같은 날짜가 해당 행을 병합 도움이 필요합니다. 내가 어디로 잘못 가고 있는지 확실하지 않지만 일련의 조인을 시도했지만 비어 있습니다.

답변

1

실제로 동일한 날짜의 레코드는 GCTTax25 열의 값이 다릅니다. GROUP BY 절에서이 열을 제거하고 SELECT 목록에 집계하면 중복 날짜에 대한 단일 레코드가 남습니다.

아래의 쿼리에서 명시 적 내부 조인과 ON 절의 조인 조건을 사용하여 암시 적 조인 (FROM 절에 쉼표로 구분 된 테이블 목록 사용)을 대체했습니다. 이것은 이제 쿼리를 작성하는 표준 방법이며이를 통해 훨씬 쉽게 읽을 수 있습니다. INNER JOIN이 너무 제한적인 경우 아마도 LEFT JOIN을 사용하려고했을 것입니다.

SELECT TICKETS.TICKETID, 
     RECEIPTS.DATENEW, 
     MAX(TAXCATEGORIES.NAME) = 'GCT' as GCT,   -- one value per date 
     MAX(TAXCATEGORIES.NAME) = 'Tax 25%' as Tax25, -- one value per date 
     TAXLINES.AMOUNT, 
     SUM(TAXLINES.AMOUNT) AS TOTAL, 
     SUM(CASE WHEN taxcategories.NAME = 'GCT' THEN taxlines.AMOUNT ELSE 0 END) AS GCTTOTAL, 
     SUM(CASE WHEN taxcategories.NAME = 'Tax 25%' THEN taxlines.AMOUNT ELSE 0 END) AS TAX25TOTAL 
FROM RECEIPTS 
INNER JOIN TAXLINES 
    ON RECEIPTS.ID = TAXLINES.RECEIPT 
INNER JOIN TAXES 
    ON TAXLINES.TAXID = TAXES.ID 
INNER JOIN TAXCATEGORIES 
    ON TAXES.CATEGORY = TAXCATEGORIES.ID 
INNER JOIN TICKETS 
    ON RECEIPTS.ID = TICKETS.ID 
INNER JOIN PAYMENTS 
    ON PAYMENTS.RECEIPT = RECEIPTS.ID 
WHERE DATENEW >= '2016-07-14 00:00:00' AND 
     DATENEW <= '2016-07-14 23:00:00' 
GROUP BY CAST(RECEIPTS.DATENEW AS DATE) 
+1

이것은 절대적으로 적합합니다. 감사합니다 @ tim-biegeleisen –

+1

@RobertFarr 기꺼이 도와 드리겠습니다. –

관련 문제