इसके लिए आप group by
करना चाहते हैं
चार्ट_नम और विज़िट करें। समान चार्ट_नम और विज़िट वाली कोई भी पंक्तियाँ परिणाम में एकल पंक्ति के रूप में दिखाई देंगी। फिर आप sum
कर सकते हैं
प्राप्त राशि, यह एक समूह के लिए सभी मूल्यों को जोड़ देगा।
select
chart_num,
visit,
sum(card_amount_received) as card_amount_received
from table1
group by chart_num, visit
chart_name
एक समस्या है। आप इसे प्रदर्शित नहीं कर सकते क्योंकि यह group by
का हिस्सा नहीं है . यह एक स्ट्रिंग है इसलिए इसे sum
. जैसे कार्यों के साथ एकत्रित करने का कोई मतलब नहीं है या count
. हालांकि डेटा में चार्ट_नम का चार्ट_नाम समान है, इसकी गारंटी नहीं है।
एक समाधान group_concat
का इस्तेमाल करना है
समूह में प्रत्येक नाम को एक साथ जोड़ने के लिए। प्रति समूह केवल एक नाम होना चाहिए।
select
chart_num,
visit,
group_concat(chart_name) as chart_name,
sum(card_amount_received) as card_amount_received
from table1
group by chart_num, visit
हालाँकि, उचित समाधान स्कीमा को ठीक करना है। चार्ट_नाम डुप्लीकेट है, और इससे बचा जाना चाहिए। इसके बजाय, चार्ट स्तंभों को उनकी अपनी तालिका में ले जाएँ। फिर चार्ट का नाम पाने के लिए, चार्ट_नम में शामिल हों।
create table charts (
id serial primary key,
name varchar(255) not null
);
insert into charts (id, name) values
(4, 'user1'), (5, 'user2'), (6, 'user3'), (7, 'user4');
alter table table1 drop column chart_name;
select
charts.id as chart_num,
visit,
charts.name as chart_name,
sum(card_amount_received) as card_amount_received
from table1
join charts on charts.id = chart_num
group by chart_num, visit
हमें दूसरी तालिका के साथ कार्ड_डेट से मेल खाने वाली दूसरी तालिका के साथ बाएं जुड़ने की आवश्यकता है। लेफ्ट जॉइन का मतलब है "लेफ्ट" टेबल की सभी पंक्तियां (यानी from
टेबल) हमेशा दिखाई देगा, भले ही जॉइन टेबल में कोई मैच न हो
।
यात्रा एक तिथि है। card_date एक तारीख नहीं बल्कि एक टाइमस्टैम्प है। उनका मिलान करने के लिए हमें card_date
. को रूपांतरित करना होगा एक तारीख के लिए।
select
charts.id as chart_num,
visit,
charts.name as chart_name,
sum(card_amount_received) as card_amount_received,
table2.card_date,
table2.advanced_amount as amount
from table1
join charts on charts.id = chart_num
left join table2 on date(table2.chart_date) = visit
group by chart_num, visit
हमें Advanced_amount की तुलना sum(card_amount_received) से करनी होगी। अगर वे बराबर हैं:ठीक है। यदि नहीं:त्रुटि। मानक SQL में हम एक case
का उपयोग करेंगे
, लेकिन मारियाडीबी में एक गैर-मानक if
है
यह बहुत अधिक कॉम्पैक्ट है।
select
charts.id as chart_num,
visit,
charts.name as chart_name,
sum(card_amount_received) as card_amount_received,
table2.card_date,
table2.advanced_amount as amount,
if(table2.advanced_amount = sum(card_amount_received), 'ok', 'error') as result
from table1
join charts on charts.id = chart_num
left join table2 on date(table2.chart_date) = visit
group by chart_num, visit