प्राप्त करें मैं एक समूह पर गिनती के लिए औसत प्राप्त करने की कोशिश कर रहा हूं, सबकुरी के साथ जुड़कर। पता नहीं है कि क्या यह बिल्कुल सही तरीका है लेकिन मैं मैसेमा दस्तावेज़ के अलावा अन्य सामानों के बारे में कुछ भी नहीं कर सका।जेपीक्यूएल/क्वेरीरीएसएल: सबक्वायरी में शामिल हों और अलियाड कॉलम
परिदृश्य: ग्राहक द्वारा प्रति उत्पाद कितने आदेश औसतन करते हैं? मतलब: एक ग्राहक आदेश उत्पादों। तो एक ग्राहक ने एक विशिष्ट उत्पाद को कई बार (गिनती) का आदेश दिया। ग्राहक द्वारा किसी भी उत्पाद के लिए रखे गए आदेशों की औसत संख्या क्या है?
थोड़ा सा कल्पित ध्वनि हो सकता है, वास्तव में यह प्रोटोटाइप का हिस्सा है, लेकिन इससे मुझे आश्चर्य हुआ कि माईसेमा से फैंसी क्वेरीडीएसएल के साथ एक सबक्वायरी में बनाए गए कस्टम कॉलम का संदर्भ कैसे प्राप्त किया जाए।
एसक्यूएल में आप केवल गिनती कॉलम को उपनाम देते हैं और दूसरे आईडी कॉलम का उपयोग करने में शामिल होते हैं। QueryDSL में "as()" विधि भी है लेकिन मेरे पास कोई विचार नहीं है, उस कॉलम को कैसे पुनर्प्राप्त करें और मैं यह नहीं देखता कि यह किसी अन्य प्रश्न के साथ एक प्रश्न में कैसे शामिल हो सकता है, क्योंकि query.list() को सिर्फ एक सूची मिलती है लेकिन कुछ के लिए कारण इसे स्वीकार करता है। गलत लगता है ...
यहाँ मेरी कोड है:
JPQLQuery query = createJPQLQuery();
QOrdering qOrdering = QOrdering.ordering;
QProduct qProduct = QProduct.product;
QCustomer qCustomer = QCustomer.customer;
// how many of each product did a customer order?
HibernateSubQuery subQuery = new HibernateSubQuery();
subQuery.from(qOrdering).innerJoin(qOrdering.product,qProduct).innerJoin(qOrdering.customer, qCustomer);
subQuery.groupBy(qCustomer,qProduct).list(qCustomer.id,qProduct.id,qProduct.count());
// get the average number of orders per product for each customer
query.from(qCustomer);
query.innerJoin(subQuery.list(qCustomer.id,qOrdering.count().as("count_orders")));
query.groupBy(qCustomer.id);
return (List<Object[]>) query.list(qCustomer.firstname,subQuery.count_orders.avg());
फिर: मैं एक सबक्वेरी के साथ कैसे शामिल होऊं? मैं एजीजी (मेरा समूह सही बीटीडब्ल्यू है?) अधिक समेकन करने के लिए एलियाज्ड "गिनती" कॉलम कैसे प्राप्त करूं? हो सकता है कि इसमें कुछ अन्य त्रुटियां हों, इसलिए किसी भी मदद की सराहना की!
धन्यवाद!
संपादित करें: मैं QueryDSL उपज देखना चाहते हैं देशी एसक्यूएल तरह का यही कारण है कि:
Select avg(numOrders) as average, cust.lastname from
customer cust
inner join
(select count(o.product_id) as numOrders, c.id as cid, p.name
from ordering o
inner join product p on o.product_id=p.id
inner join customer c on o.customer_id=c.id
group by o.customer_id, o.product_id) as numprods
on cust.id = numprods.cid
group by numprods.cid
order by cust.lastname;
धन्यवाद! हालांकि, हालांकि, मैं QueryDSL और किसी भी सैद्धांतिक सीमा के आधार पर एक सामान्य खोज बनाने के बारे में सोच रहा हूं, मुझे अपने खोज मार्कअप में वैकल्पिक तकनीकों को शामिल करने के बारे में सोचना है ... – Pete
हालांकि दूसरे विचार पर: मैं कैसे पहुंच सकता हूं वह एलियाज्ड गिनती() कॉलम? – Pete
उपनाम गणना कॉलम के लिए पथ पथ का उपयोग करें (पथ उपनाम, subQuery.as (उपनाम), और उसके बाद उपनाम का उपयोग करें) –