2016-09-06 4 views
0

私はこのコードを以下に示します。私は日付に基づいて行をマージしようとしています。これらの結果を1つの行にマージする方法

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) 

クエリの結果は、以下のスクリーンショットに添付されています。今、私は1つの行に同じ日付を持つそれらの行をマージする助けが必要 enter image description here

。私はどこが間違っているのかわからない、私は一連の結合を試みたが、空白になる。

答えて

1

GCTTax25の列では、同じ日付のレコードの値が実際に異なるようです。 GROUP BY句からこれらの列を削除し、それらをSELECTリストに集計すると、重複した日付のレコードが1つだけ残ります。

以下のクエリでは、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お世話になりました。 –

関連する問題