προβλημα σε ερωτημα της ms sql

Συζητήσεις για τον Microsoft SQL Server

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

Απάντηση
eirini24
Δημοσιεύσεις: 11
Εγγραφή: 24 Μάιος 2006 20:32

προβλημα σε ερωτημα της ms sql

Δημοσίευση από eirini24 » 31 Μάιος 2006 18:51

Καλησπέρα παιδια.Θα ήθελα την πολύτιμη βοήθειά σας.
εχω δημιουργήσει ενα ερώτημα στην sql το οποίο θελω να μου επιστρεφει στοιχεια των ειδών των οποίων η ποσότητα πώλησης τον τελευταίο χρόνο είναι μικρότερη απο 5.
Εχω κάνει:
select
Order_Cust_Details.Pcode,
Category.Catdescription,
Product.SourceCompany,
Product.Pattribute,
Product.Pdescription,
Order_Cust_Details.Cust_Details_quantity

from Order_Cust_Details,
Product,
Category,
Invoice
where
Order_Cust_Details.Pcode=Product.Pcode
AND Product.Catcode=Category.Catcode
AND Order_Cust_Details.Order_Cust_No=Invoice.Order_Cust_No
AND Order_Cust_Details.Order_Cust_No=Receipt.Order_Cust_No
AND Order_Cust_Details.Order_Cust_No=Bill_of_goods.Order_Cust_No
AND Invoice.I_datepaid > (SELECT GETDATE()-360)group by Order_Cust_Details.Pcode
having sum(Order_Cust_Details.Cust_Details_quantity)<5

αλλα μου βγάζει πρόβλημα για τα
Category.Catdescription,
Product.SourceCompany,
Product.Pattribute,
Product.Pdescription,
Order_Cust_Details.Cust_Details_quantity
και δεν ξερω που κολλαει.Αν ξερει κάποιος please λιγη βοήθεια!
Ακολουθεί επισύναψη με τους πινακες για όποιον ενδιαφερεται.
Σας ευχαριστώ για οποιαδήποτε βοήθεια
EIRINI24

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

προβλημα σε ερωτημα της ms sql

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

Δεν βλέπω στο FROM να χρησιμοποιείς τους πίνακες Receipt, Bill_of_goods που χρησιμοποιείς στις συνθήκες.
...Ακολουθεί επισύναψη με τους πινακες...
Είναι κάπου η επισύναψη και δεν τη βρίσκω; :question: :question: :question:

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

προβλημα σε ερωτημα της ms sql

Δημοσίευση από dva_dev » 01 Ιουν 2006 11:15

Το Invoice.I_datepaid > (SELECT GETDATE()-360) τι προσπαθεί να κάνει;

eirini24
Δημοσιεύσεις: 11
Εγγραφή: 24 Μάιος 2006 20:32

προβλημα σε ερωτημα της ms sql

Δημοσίευση από eirini24 » 01 Ιουν 2006 12:36

Καλημερα,
Sorry εκανα λαθος και εβαλα τα Receipt και Bill_of_goods τωρα.Θελω όμως μετα την ίδια συνθήκη που κάνω με το Invoice να την κάνω και για αυτά τα 2.
το Invoice.I_datepaid > (SELECT GETDATE()-360) ειναι για να βρισκει τις ημερομηνίες πώλησης του τελευταίου χρόνου.Κάνω κάτι λάθος?Μπορεί δε ξέρω!Τρέχω για να τα προλάβω αυτά και μάλλον κάνω βλακεία και δεν το πιάνω!
Η επισύναψη τι να σου πω, εγω την έκανα τωρα που πήγε.....
Θα τους βάλω εδώ τους πίνακες που είχε μέσα το αρχείο


CREATE TABLE Category
(
Catcode BIGINT NOT NULL,
Catdescription VARCHAR(50) NOT NULL,
Primary key (Catcode)
)

CREATE TABLE Product
(
Pcode BIGINT NOT NULL,
Pdescription VARCHAR(50) NOT NULL,
Pconstruction_date DATETIME NULL,
Pattribute VARCHAR(30) NOT NULL,
Value_WFPA BIGINT NOT NULL,
Fpa BIGINT NOT NULL,
SourceCompany VARCHAR(30) NOT NULL,
Fund BIGINT NOT NULL,
Catcode BIGINT NOT NULL,
primary key (Pcode),
Foreign key(Catcode) references Category(Catcode)
)
CREATE TABLE Order_Cust
(
Order_Cust_No INT NOT NULL IDENTITY(1, 1),
Order_Cust_date DATETIME NOT NULL,
Order_Cust_promised_date DATETIME NOT NULL,
Order_Ccode BIGINT NOT NULL,
primary key (Order_Cust_No),
Foreign key(Order_Ccode) references Client(Ccode)
)

CREATE TABLE Order_Cust_Details
(
Order_Cust_No INT NOT NULL IDENTITY(1, 1),
Pcode BIGINT NOT NULL,
Cust_Details_quantity INT NOT NULL,
primary key (Order_Cust_No, Pcode),
Foreign key(Order_Cust_No) references Order_Cust (Order_Cust_No),
Foreign key(Pcode) references Product (Pcode)
)
CREATE TABLE Invoice
(
Invoice_No INT NOT NULL IDENTITY(1, 1),
I_value REAL NOT NULL,
I_date DATETIME NOT NULL,
I_datepaid DATETIME NOT NULL,
I_status INT NULL,
Order_Cust_No INT NOT NULL,
primary key(Invoice_No),
Foreign key(Order_Cust_No) references Order_Cust (Order_Cust_No)
)


Σε ευχαριστώ πολύ πάντως για την βοήθεια ότι αποτέλεσμα και να έχει!
EIRINI24

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

προβλημα σε ερωτημα της ms sql

Δημοσίευση από dva_dev » 01 Ιουν 2006 15:26

Για να αφαιρέσεις από μια ημερομηνία κάποιο διάστημα καλύτερα να χρησιμοποιήσεις την DATEADD
Αντί να κάνεις SELECT GETDATE()-360 μπορείς να κάνεις SELECT DATEADD(yyyy,-1,GETDATE())
Επειδή όμως η GETDATE() σου επιστρέφει και ώρα, ίσως είναι προτιμότερο να την σφάξεις και να μείνει μόνο η ημερομηνία.
Ενας ενδεικτικός τρόπος (δεν ξέρω αν είναι ο πιο γρήγορος, δεν το έχω ελέγξει ποτέ) είναι ο εξής:

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

SELECT CONVERT&#40;DATETIME, FLOOR&#40;CONVERT&#40;FLOAT, GETDATE&#40;&#41;&#41;&#41;&#41;
Θα πρότεινα να φτιάξεις μια function που να κάνει τα παραπάνω και να σου επιστρέφει καθαρή την ημερομηνία χωρίς ώρα
π.χ.

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

CREATE FUNCTION CalcDate&#40;@dtOldDate DATETIME, @nDays INT, @nMonths INT, @nYears INT&#41; RETURNS DATETIME AS
BEGIN
DECLARE @dtCalc DATETIME

	SET @dtCalc = CONVERT&#40;DATETIME, FLOOR&#40;CONVERT&#40;FLOAT, @dtOldDate&#41;&#41;&#41;
	IF &#40;@nDays <> 0&#41;
		SET @dtCalc = DATEADD&#40;dd,@nDays,@dtCalc&#41;
	IF &#40;@nMonths <> 0&#41;
		SET @dtCalc = DATEADD&#40;mm,@nMonths,@dtCalc&#41;
	IF &#40;@nYears <> 0&#41;
		SET @dtCalc = DATEADD&#40;yyyy,@nYears,@dtCalc&#41;
	RETURN @dtCalc
END
Και στη συνθήκη σου την χρησιμοποιείς κατευθείαν

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

...AND Invoice.I_datepaid > dbo.CalcDate&#40;GETDATE&#40;&#41;,0,0,-1&#41;
...AND ...

eirini24
Δημοσιεύσεις: 11
Εγγραφή: 24 Μάιος 2006 20:32

προβλημα σε ερωτημα της ms sql

Δημοσίευση από eirini24 » 01 Ιουν 2006 19:30

Σε ευχαριστώ για την βοήθεια.
Εξακολουθεί να μου βγάζει errors και δεν καταλαβαίνω όμως πως να το διορθώσω.Τα errors τα βγάζει όταν βάζω και την συνθήκη για να κάνει άθροισμα της ποσότητας πώλησης.
Δηλαδή το query μου είναι αυτό
select
Order_Cust_Details.Pcode,
Category.Catdescription,
Product.SourceCompany,
Product.Pattribute,
Product.Pdescription,
Order_Cust_Details.Cust_Details_quantity

from Order_Cust_Details,
Product,
Category,
Invoice
where
Order_Cust_Details.Pcode=Product.Pcode
AND Product.Catcode=Category.Catcode
AND Order_Cust_Details.Order_Cust_No=Invoice.Order_Cust_No
AND Invoice.I_datepaid > dbo.CalcDate(GETDATE(),0,0,-1) group by Order_Cust_Details.Pcode
having sum(Order_Cust_Details.Cust_Details_quantity)<5

και για αυτά που έχω στο select λέει:
Column ....... is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Αν καταλαβαίνεις τι γίνεται πες μου που κάνω λάθος
Σ' ευχαριστώ....
EIRINI24

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

προβλημα σε ερωτημα της ms sql

Δημοσίευση από dva_dev » 02 Ιουν 2006 01:18

Απ' ότι κατάλαβα προσπαθείς να φέρεις το άθροισμα των Order_Cust_Details.Cust_Details_quantity ανά Product.Pcode. Μόνο όμως όσα το άθροισμα(Order_Cust_Details.Cust_Details_quantity) < 5 και παράλληλα θέλεις να φέρεις και κάποια άλλα στοιχεία σχετικά με το product code.

Για να φέρεις το άθροισμα πρέπει να φέρεις στο select το ίδιο πράγμα που έχεις και στο having. Δηλαδή:
SELECT ..., SUM(Order_Cust_Details.Pcode) FROM ... HAVING SUM(Order_Cust_Details.Pcode) < 5

Τα μηνύματα λαθών που αναφέρεις, σου λένε ότι όταν χρησιμοποιείς group by, πρέπει όλα τα πεδία που είναι μέσα στο SELECT πρέπει ή να είναι σε μέσα σε κάποια function που ομαδοποιεί τα δεδομένα (MIN, MAX, SUM, ...) ή όσα δεν είναι μέσα σε τέτοια function να είναι στο group by.

Δηλαδή δεν μπορείς να έχεις
select a,b,sum(c) from t group by a -- το πεδίο b δεν είναι ούτε σε function ούτε στο group by
αλλα πρέπει να είναι
select a,b,sum(c) from t group by a,b

Οπότε φαντάζομαι αυτό που μπορείς να κάνεις είναι:
α) Να φέρεις το άθροισμα και να κάνεις group by με όλα τα υπόλοιπα πεδία
β) Να φέρεις το άθροισμα κάνοντας group by με το product code, και μετά να χρησιμοποιήσεις αυτά τα στοιχεία για να φέρεις και τα υπόλοιπα πεδία που αναφέρονται σε αυτό το product code.
Αν και το α) είναι πιο απλό στην υλοποίηση, ουσιαστικά το β) μου φαίνεται λογικά σωστότερο. Και τα δύο κάνουν το ίδιο πράγμα. Τώρα το τι είναι γρηγορότερο θα πρέπει να το τσεκάρεις με τα data σου.

α)

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

SELECT
    Order_Cust_Details.Pcode,
    Category.Catdescription,
    Product.SourceCompany,
    Product.Pattribute,
    Product.Pdescription,
    SUM&#40;Order_Cust_Details.Cust_Details_quantity&#41;
FROM
    Order_Cust_Details,
    Product,
    Category,
    Invoice
WHERE
    Order_Cust_Details.Pcode=Product.Pcode
    AND Product.Catcode=Category.Catcode
    AND Order_Cust_Details.Order_Cust_No=Invoice.Order_Cust_No
    AND Invoice.I_datepaid > dbo.CalcDate&#40;GETDATE&#40;&#41;,0,0,-1&#41;
GROUP BY
    Order_Cust_Details.Pcode,
    Category.Catdescription,
    Product.SourceCompany,
    Product.Pattribute,
    Product.Pdescription
HAVING
    SUM&#40;Order_Cust_Details.Cust_Details_quantity&#41; < 5
β)

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

SELECT
    tmpSum.Pcode,
    Category.Catdescription,
    Product.SourceCompany,
    Product.Pattribute,
    Product.Pdescription,
    tmpSum.SUM_Quantity
FROM
    Product,
    Category,
    &#40;
        SELECT
            Order_Cust_Details.Pcode,
            SUM&#40;Order_Cust_Details.Cust_Details_quantity&#41; AS SUM_Quantity
        FROM
            Order_Cust_Details,
            Invoice
        WHERE
            Order_Cust_Details.Order_Cust_No=Invoice.Order_Cust_No
            AND Invoice.I_datepaid > dbo.CalcDate&#40;GETDATE&#40;&#41;,0,0,-1&#41;
        GROUP BY
            Order_Cust_Details.Pcode
        HAVING
            SUM&#40;Order_Cust_Details.Cust_Details_quantity&#41; < 5
    &#41; tmpSum
WHERE
       Product.Catcode=Category.Catcode
    AND tmpSum.Pcode=Product.Pcode
Την ουσιαστική δουλειά την κάνει το subquery (tmpSum), το εξωτερικό φέρνει τα επιπλέον στοιχεία που αφορούν το product code

Εσύ αποφασίζεις.

eirini24
Δημοσιεύσεις: 11
Εγγραφή: 24 Μάιος 2006 20:32

προβλημα σε ερωτημα της ms sql

Δημοσίευση από eirini24 » 02 Ιουν 2006 13:10

Σε ευχαριστώ πάρα πολυ! :yea:
Λειτούργησε και με σωστά αποτελεσματα.
Αυτό ήταν για την πτυχιακή και ήταν το τελευταίο που μου είχε μείνει και είχα κολλήσει.
Σε ευχαριστώ και πάλι πολύ! :lol:
EIRINI24

Απάντηση

Επιστροφή στο “MS SQL Server”

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

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