Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

query problem

Îåêßíçóå áðü ôï ìÝëïò Bill . Τελευταία δημοσίευση από το μέλος Bill στις 12-11-2007, 22:59. Υπάρχουν 11 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  06-11-2007, 19:15 37005

    query problem

    Θα σας περιγράψω συνοπτικά το προβλημα μου ακουγεται πολύ απλό αλλά (τουλάχιστον για μένα) είναι έως και ακατόρθωτο!!

    Φανταστείται έναν απλο πίνακα με μερικές εγγραφές έχω ένα query  το οποίο τραβάει εν ολίγης data απο μια ομάδα πινάκων θέλω να προσθέσω στο query μου μια στήλη η οποία θα αθροίζει προοδευτικά ανα row δηλαδή :

    έστω   row  1: 10

              row  2: 10 + την τιμή πού έχει στο row 2 

    δηλαδή να μου αθροίζει κάθε φορά και στην τρέχουσα τιμή την αμέσως προηγούμενη πχ αν έχω : 10, 20, 30 , μία στήλη

    θέλω να έρχεται σε άλλη η στην ίδια 10,20 + 10 , 30 + 20 + 10....κοκ το έχω κάνει για μια εκτύπωση στην εταιρεία μου με fast report παίζοντας με  τα event onbeginband & onbeginendband και δουλεύει σωστά έως τώρα.. αθροίζοντας απευθειας με κώδικα!! Θα ήθελα να το κάνω απευθείας SQL στο query μου έκανα μια προσπάθεια με ένα subselect αλλά δεν μου έφερνε σωστά data!!! Γενικά δεν έχω χρησιμοποιήσει ποτέ  loopes στην sql μήπως υπάρχει κάποιος τρόπος ευκολότερος ??


    select DATEDIFF(dd,GetDate(),'20140731') AS EΠΟΜΕΝΕΣ_ΔΙΑΚΟΠΕΣ
  •  09-11-2007, 15:52 37157 σε απάντηση της 37005

    Re: query problem

    Υπάρχουν 2-3 λύσεις. Αν είναι πεδίο στην βάση σου μπορείς με ένα Loop (WHILE) να κάνεις update όλες τις εγγραφές (ή και με Cursor).

    Αν δεν είναι πεδίο στην βάση μπορείς να το κάνεις με προσωρινό πίνακα όπου θα έχει τα πεδία του πίνακα + το εξτρα πεδίο που χρειάζεσαι, και εκτελείς το παραπάνω στον προσωρινό πίνακα. Μετά εμφανίζεις τον πίνακα αυτόν (και τον σβήνεις).

    Παλαιά είχα κάνει και μία λύση με SubQuery αλλά δεν την θυμάμαι... θα την ψάξω και αν την βρώ θα Postάρω.

    EDIT:
    Αλλη μία λύση είναι με Function.

    Εστω ότι έχεις έναν πίνακα...
    CREATE TABLE [dbo].[test](
        [RowID] [int] NOT NULL,
        [rowtext] [char](10) NOT NULL,
        [Income] [int] NOT NULL)
    -- Income can be negative...

    Και θέλεις να το κάνεις select με ένα τέταρτο πεδίο Current Balance

    Φτιάχνεις την Function
    CREATE FUNCTION [dbo].[GetBalance]  (@RowID int )
    RETURNS int
    AS
    BEGIN
    DECLARE @RES int
        Select @RES=Sum(Income) from test where RowID<=@RowID
    Return @RES
    END


    και μετά κάνεις

    Select Test .*, dbo.GetBalance(RowID) as NewBalance from Test


    Αυτό δουλεύει δυστυχώς μόνο με ΟΛΑ τα records (γιατί μέσα στην Function δεν έχει WHERE) αν θέλεις με where πρεπει να αλλάξει και η Function.

    Εγώ θα προτιμούσα το Temp πίνακα.

    -------------------------------
    Κ. Γιαγιάς

    Θα ήθελα να είμαι μέσα στην φωτογραφία και όχι εδώ!!!!

    http://beastie06.wordpress.com
  •  09-11-2007, 17:57 37173 σε απάντηση της 37157

    Απ: Re: query problem

    SELECT t1.ID, t1.Value1, SUM(t2.Value1) AS ProodeytikoA8roisma
    FROM Table1 t1 INNER JOIN Table1 t2 ON t1.ID >= t2.ID
    GROUP BY t1.ID, t1.Value1
    ORDER BY t1.ID, t1.Value1

    Nothing to declare...
  •  11-11-2007, 18:32 37218 σε απάντηση της 37005

    Απ: query problem

    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH cteA AS
    (
      SELECT [Id], [value], ROW_NUMBER() OVER(ORDER BY [Id]) AS [rn]
      FROM myTable
    )


    SELECT cur.[Id], (ISNULL(prev.[Value], 0) + cur.[Value]) AS [newValue]
    FROM cteA cur
      LEFT OUTER JOIN cteA prev ON cur.[rn] = prev.[rn] + 1

    Δεδομένου ότι χρησιμοποιείς SQL 2005, το καλύτερο δυνατό performance θα το πάρεις με CTE και rownumber.

     

  •  12-11-2007, 11:00 37228 σε απάντηση της 37005

    Απ: query problem

    Thanks σε όλους!!! Έκανα και εγώ ένα subselect με ένα mix απο τις ιδέες που μου δώσατε και τελικά δουλεύει!!

    και πάλι ευχαρηστώ!!


    select DATEDIFF(dd,GetDate(),'20140731') AS EΠΟΜΕΝΕΣ_ΔΙΑΚΟΠΕΣ
  •  12-11-2007, 11:08 37229 σε απάντηση της 37218

    Re: Απ: query problem

    Ο thiseas έδωσε το Query που έψαχνα (αλλά δεν το έβρισκα).

    immortality:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH cteA AS
    (
      SELECT [Id], [value], ROW_NUMBER() OVER(ORDER BY [Id]) AS [rn]
      FROM myTable
    )


    SELECT cur.[Id], (ISNULL(prev.[Value], 0) + cur.[Value]) AS [newValue]
    FROM cteA cur
      LEFT OUTER JOIN cteA prev ON cur.[rn] = prev.[rn] + 1

    Δεδομένου ότι χρησιμοποιείς SQL 2005, το καλύτερο δυνατό performance θα το πάρεις με CTE και rownumber.

     

    Αυτό δεν το γνώριζα. Να φανταστω ότι αν θέλουμε μέρος των εγγραφών μας το Where συμπληρώνεναι μόνο στο Select που δημιουργεί τον cteA.

    Θα το δοκιμάσω.


    Στον Test πίνακα που δοκιμάζω. Το query του Thiseas λειτουργεί αλλά μόνο για όλες τις εγγραφές.


    Στον source του immortality δεν βγαίνει το σωστό αποτέλεσμα. Το newValue εμφανίζει το άθροισμα των values του συγκεκριμένου Row και του προηγούμενου.

    RowID       Income      newValue
    ----------- ----------- -----------
    1               50          50
    2               51          101
    3               30          81
    4               10          40


    Αυτό είναι το αποτέλεσμα από έναν τέστ πίνακα

    RowID        Income
    -----------  -----------
    1               50
    2               51
    3               30
    4               10




    -------------------------------
    Κ. Γιαγιάς

    Θα ήθελα να είμαι μέσα στην φωτογραφία και όχι εδώ!!!!

    http://beastie06.wordpress.com
  •  12-11-2007, 12:11 37232 σε απάντηση της 37229

    Re: Απ: query problem


    Με αυτές τις αλλαγές λειτούργησε σωστά.
    WITH cteA AS
    (
      SELECT [Id], [value], ROW_NUMBER() OVER(ORDER BY [Id]) AS [rn]
      FROM myTable
    )


    SELECT cur.[Id], cur.[Value], (ISNULL(SUM(prev.[Value]), 0) + cur.[Value]) AS [newValue]
    FROM cteA cur
      LEFT OUTER JOIN cteA prev ON cur.[rn] > prev.[rn]
    Group By cur.[Id], cur.[Value]

    Το Sum και το Group, και αλλαγή στο Join

    -------------------------------
    Κ. Γιαγιάς

    Θα ήθελα να είμαι μέσα στην φωτογραφία και όχι εδώ!!!!

    http://beastie06.wordpress.com
  •  12-11-2007, 15:27 37244 σε απάντηση της 37232

    Απ: Re: Απ: query problem

    Φίλε Bill, η βασική ουσία του θέματος εδώ δεν είναι να σου δώσουμε μια λύση "πακέτο" αλλά κάποιες προτάσεις που με κάποιες τροποιποιήσεις θα δουλέψουνε + 4 u!


    Πρόταση:
    Αν και δεν κατάλαβα τι εννοείς οτι το qyery μου "δουλεύει μόνο για όλες τις εγγραφές" προτείνω το εξής:
    Να δουλέψεις επάνω στην κατανόηση του query και τότε είναι ευκόλο (νομίζω) να το κάνεις να δουλέψει  στα "μέτρα" σου. Wink

    Nothing to declare...
  •  12-11-2007, 15:35 37246 σε απάντηση της 37244

    Απ: Re: Απ: query problem

    Το λόγο που δεν δουλεύει το query του Thiseas as is, απλά με προσθήκη WHERE φίλτρου, τον έχουμε κουβεντιάσει εδώ: http://www.dotnetzone.gr/cs/forums/36515/ShowThread.aspx#36515 σε παρόμοιο πρόβλημα. Εμφανίζεται οποτεδήποτε κάνεις JOIN χρησιμοποιώντας τους τελεστές >= και <=

    Πραγματικά, είναι μια καλή άσκηση κατανόησης για να το κάνεις να δουλέψει Smile


    Vir prudens non contra ventum mingit
  •  12-11-2007, 15:50 37249 σε απάντηση της 37244

    Re: Απ: Re: Απ: query problem

    Thiseas:
    Φίλε Bill, η βασική ουσία του θέματος εδώ δεν είναι να σου δώσουμε μια λύση "πακέτο" αλλά κάποιες προτάσεις που με κάποιες τροποιποιήσεις θα δουλέψουνε + 4 u!
    Πρόταση:
    Αν και δεν κατάλαβα τι εννοείς οτι το qyery μου "δουλεύει μόνο για όλες τις εγγραφές" προτείνω το εξής:
    Να δουλέψεις επάνω στην κατανόηση του query και τότε είναι ευκόλο (νομίζω) να το κάνεις να δουλέψει  στα "μέτρα" σου. Wink

    Φίλε Thiseas. Την φράση "δουλεύει μόνο για όλες τις εγγραφές" την είπα εγώ και όχι ο Bill.

    Ολες οι εγγραφές = Χωρίς WHERE.


    Πιστεύω ότι η πρόταση του Immortality με την προσθήκη που έκανα ταιριάζει καλύτερα στο αποτέλεσμα που χρειάζεται ο Bill.

    Μέσα στο With μπορείς να ορίσεις ότι WHERE θέλεις αλλά και το order που θέλεις.

    -------------------------------
    Κ. Γιαγιάς

    Θα ήθελα να είμαι μέσα στην φωτογραφία και όχι εδώ!!!!

    http://beastie06.wordpress.com
  •  12-11-2007, 20:42 37262 σε απάντηση της 37249

    Απ: Re: Απ: Re: Απ: query problem

    Καλησπέρα,

    Απ' ότι φαίνεται κατάλαβα λάθος το ζητούμενο, διάβασα πολύ γρήγορα το αρχικό post. Αυτό που θέλει ο φίλος είναι αρκετά πιο απλό από αυτό που πρότεινα που στην ουσία είναι ένας generic τρόπος για πράξεις με προηγούμενα - επόμενα rows.

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    WITH cteA AS
    (
      SELECT [Id], [value], ROW_NUMBER() OVER(ORDER BY [Id]) AS [rn]
      FROM myTable
    )


    SELECT
      a.[Id],
      a.[value] + (SELECT ISNULL(SUM(b.[value]), 0) FROM cteA b WHERE b.[rn] < a.[rn]) AS [newValue]
    FROM cteA a;
  •  12-11-2007, 22:59 37263 σε απάντηση της 37249

    Απ: Re: Απ: Re: Απ: query problem

    Τελεικά όντως με την προσθήκη σου μεσα στο with με γλυτώνει απο πολύ μπέρδεμα μέσα στο query μου!!!Πολυ καλό με γλυτώνει απο πολλά!


    select DATEDIFF(dd,GetDate(),'20140731') AS EΠΟΜΕΝΕΣ_ΔΙΑΚΟΠΕΣ
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems