Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

मैं दो तालिकाओं की तुलना करने के बाद एक मैच कैसे आउटपुट करूं?

इसके लिए आप 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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JSON_REMOVE () - MySQL में JSON दस्तावेज़ से डेटा निकालें

  2. mysql:तालिका ए से सभी वस्तुओं का चयन करें यदि तालिका बी में मौजूद नहीं है

  3. MySQL ट्यूटोरियल:MySQL इन क्लॉज (बेसिक)

  4. async fn . का मॉड्यूल निर्यात परिणाम

  5. SQL का उपयोग करके एकाधिक तालिकाओं से डेटा कैसे संयोजित करें?