2017-02-18 116 views
0

下面是這種情況:表連接和group by ID的MySQL

  1. 我想從表客戶名稱1
  2. 通過ID
  3. 加入表2從表中選擇所有付款日期2
  4. 按年分組

只是爲了解釋,代碼和名稱鍵屬於Table1 paymentDate和數量鍵在Table2上,但它們共享外鍵uniqueId密鑰。

預期的結果最終應該是這樣的:

[{ 
"code": 1011, 
"name": "Customer1", 
"amount": 5000, 
"paymentDate": "2016-10-20T04:00:00.000Z" 
"paymentDate": "2016-11-20T04:00:00.000Z" 
"paymentDate": "2016-12-20T04:00:00.000Z" 
}, 
{ 
"code": 1012, 
"name": "Customer2", 
"amount": 5000, 
"paymentDate": "2016-03-20T05:00:00.000Z" 
"paymentDate": "2016-04-20T05:00:00.000Z" 
"paymentDate": "2016-05-20T05:00:00.000Z" 
"paymentDate": "2016-06-20T05:00:00.000Z" 
}, 
{ 
"code": 1013, 
"name": "Customer3", 
"amount": 5000, 
"paymentDate": "2016-01-20T05:00:00.000Z" 
"paymentDate": "2016-02-20T05:00:00.000Z" 
}] 

到目前爲止,我有這樣的:

SELECT coreObjects.code, 
     coreObjects.name, 
     lateobjectpayments.amount, 
     lateobjectpayments.paymentDate 
FROM coreObjects 
JOIN lateobjectpayments 
     ON coreObjects.uniqueId=lateobjectpayments.uniqueId 
GROUP BY YEAR(lateobjectpayments.paymentDate) 

看來我需要多選擇附近的加入,但沒有我想的那麼遠。如果有人能幫助我,我將不勝感激。

+0

我在你的例子中沒有看到你在哪裏按年進行分組。這是你所困擾的問題嗎? –

+0

實際上查詢中缺少按年份分組,但仍然沒有; t給我我想要的值 – itismelito

+0

目前的輸出是什麼? –

回答

0

問題是,您不能通過聚合(它將多個原始元組合併成一個結果元組)和細節選擇(它需要所有原始元組)在單個group by語句中混合組。 如果您使用條款GROUP BY YEAR(lateobjectpayments.paymentDate)編寫查詢,那麼結果每年至多包含一個元組,並且只有一個customer和paymentDate與這樣的結果元組關聯。

因此,將查詢拆分爲子查詢;一個用於獲取聚合值(即amount)每uniqueIdyear,以及其他爲「取回」的詳細信息:

select c.*, aggr.amount, lop.* 
from (select uniqueId, year(paymentDate) as year, sum(amount) as amount from 
lateobjectpayments 
group by uniqueId, year(paymentDate)) aggr 
join coreObjects c on c.uniqueId = aggr.uniqueId 
join lateobjectpayments lop on year(lop.paymentDate)=aggr.year and lop.uniqueId = aggr.uniqueId 

請注意,SQL結果是表格形式的,而不是半結構化,例如,JSON。但是從你選擇的任何編程語言中以表格形式派生半結構化表單應該很容易。