provlima me sql erotima

Γενικές συζητήσεις για SQL και SQL Servers (RDBMS)

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
LeeRoy
Δημοσιεύσεις: 4
Εγγραφή: 18 Μάιος 2005 05:17

provlima me sql erotima

Δημοσίευση από LeeRoy » 05 Ιαν 2006 14:00

Καλησπέρα σε όλους σας και ΚΑΛΗ ΧΡΟΝΙΑ.

θα ήθελα την βοήθειά σας σε ένα προβληματάκι που έχω

εχω το εξης σχεσιακό σχήμα που φαίνεται στην εικόνα

Μήπως θα μπορούσε κάποιος να βοηθήσει στo να υλοποιηθούν σε microsoft
sql τα 2 ερωτήματα?

i)Ποιοι είναι οι δύο (ή περισσότεροι, σε περίπτωση ισοπαλίας) πελάτες με τη
μεγαλύτερη και τη μικρότερη συνολικά αξία συναλλαγών; Στο αποτέλεσμα θα εμφανίζονται: κωδικός πελάτη, συνολική αξία συναλλαγών.

ii)Ποιοι είναι οι πελάτες που έχουν κάνει έστω μία συναλλαγή που περιείχε όλες τις κατηγορίες ειδών; Στο αποτέλεσμα θα εμφανίζονται: κωδικός πελάτη, πλήθος συναλλαγών που περιείχαν όλες τις κατηγορίες ειδών.

Ευχαριστώ εκ των προτέρων για την βοηθεια
Συνημμένα
sxesiako1.jpg

lakritidis
Δημοσιεύσεις: 401
Εγγραφή: 04 Αύγ 2005 14:35
Τοποθεσία: Katerini
Επικοινωνία:

provlima me sql erotima

Δημοσίευση από lakritidis » 10 Ιαν 2006 14:46

Θα πρέπει μέσα στον πίνακα των πελατών να ορίζεις μια row στην οποία θα αθροίονται οι αξίες όλων των συναλλαγών του πελάτη. Έστω αυτή λέγεται TotalTransValue. Το query σου θα πρέπει να είναι

Κώδικας: Επιλογή όλων

Select * from customers where TotalTransValue = (Select max(TotalTransValue) from customers)
kai

Κώδικας: Επιλογή όλων

Select * from customers where TotalTransValue = (Select min(TotalTransValue) from customers)

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

provlima me sql erotima

Δημοσίευση από dva_dev » 10 Ιαν 2006 23:56

i)Ποιοι είναι οι δύο (ή περισσότεροι, σε περίπτωση ισοπαλίας) πελάτες με τη μεγαλύτερη

Κώδικας: Επιλογή όλων

select *
from (
	select transactions.transcustomer, sum([quantity]*[ivalue]) as totalvalue
	from transactions inner join transactionitems on transactions.transid = transactionitems.transid
	group by transactions.transcustomer
	order by sum([quantity]*[ivalue])
) as v2
where v2.totalvalue = 
(
	select max(v1.totalvalue) as maxvalue
	from (
		select transactions.transcustomer, sum([quantity]*[ivalue]) as totalvalue
		from transactions inner join transactionitems on transactions.transid = transactionitems.transid
		group by transactions.transcustomer
		order by sum([quantity]*[ivalue])
	) v1
);
και τη μικρότερη συνολικά αξία συναλλαγών

Κώδικας: Επιλογή όλων

select *
from (
	select transactions.transcustomer, sum([quantity]*[ivalue]) as totalvalue
	from transactions inner join transactionitems on transactions.transid = transactionitems.transid
	group by transactions.transcustomer
	order by sum([quantity]*[ivalue])
) as v2
where v2.totalvalue = 
(
	select min(v1.totalvalue) as maxvalue
	from (
		select transactions.transcustomer, sum([quantity]*[ivalue]) as totalvalue
		from transactions inner join transactionitems on transactions.transid = transactionitems.transid
		group by transactions.transcustomer
		order by sum([quantity]*[ivalue])
	) v1
);
ii)Ποιοι είναι οι πελάτες που έχουν κάνει έστω μία συναλλαγή που περιείχε όλες τις κατηγορίες ειδών; Στο αποτέλεσμα θα εμφανίζονται: κωδικός πελάτη, πλήθος συναλλαγών που περιείχαν όλες τις κατηγορίες ειδών.

Κώδικας: Επιλογή όλων

select customers.custcode, count(transactions.transid) as countoftransid
from (
	select q1.transid, count(q1.categoryid) as countofcategoryid
	from (
		select distinct item_categories.categoryid, transactions.transid
		from transactions
			left join (((item_categories
				right join item_groups on item_categories.categoryid = item_groups.group_categoryid)
				right join items on item_groups.groupid = items.itemgroupid)
				right join transactionitems on items.itemid = transactionitems.itemid)
				on transactions.transid = transactionitems.transid
		order by item_categories.categoryid, transactions.transid
	) q1
	group by q1.transid
	having  count(q1.categoryid) = (select count(*) from item_categories)
) q2
	inner join (customers 
		inner join transactions
		on customers.custcode = transactions.transcustomer)
	on q2.transid = transactions.transid
group by customers.custcode;
Δεν είναι και ότι καλύτερο, αλλά καλή και η παναγιώταινα.
Σίγουρα πάντως θα πρέπει να το τεστάρεις καλά με τα data που έχεις.

Άβαταρ μέλους
cordis
Administrator, [F|H]ounder, [C|S]EO
Δημοσιεύσεις: 27622
Εγγραφή: 09 Οκτ 1999 03:00
Τοποθεσία: Greece
Επικοινωνία:

provlima me sql erotima

Δημοσίευση από cordis » 15 Ιαν 2006 17:04

Και αν είμαστε φοιτητές καλό θα είναι να επεξεργαζόμαστε τις απαντήσεις και να μη τρώμε μασημένη τροφή για να μαθαίνουμε και κάτι.. ;)
Δεν απαντάω σε προσωπικά μηνύματα με ερωτήσεις που καλύπτονται από τις ενότητες του forum. Για ο,τι άλλο είμαι εδώ για εσάς.
- follow me @twitter

Απάντηση

Επιστροφή στο “Βάσεις Δεδομένων και SQL - γενικά”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης