2012-03-28 15 views
0

Ich habe Tabelle dieser Felder aus:Wie Gruppe, min finden und Anzahl der gruppierten Datensätze zählen

id | date_from | date_to  | price | status 
---------------------------------------------------------- 
CK1  22-12-2012 29-12-2012  800   1 
CK1  22-12-2012 29-12-2012  1200  1 
CK2  24-12-2012 30-12-2012  1400  0 
CK2  24-12-2012 30-12-2012  1800  1 
CK2  24-12-2012 30-12-2012  2200  1 

Wie erstelle ich SQL wählen, dass Gruppen Ergebnisse von ID, DATE_FROM, DATE_TO und niedrigsten Wert nimmt ab Preis wo Status == 1 und auch Menge von wie viele Datensätze wo gruppiert zu zählen?

So würde

id | date_from | date_to  | price | count 
CK1  22-12-2012 29-12-2012  800  2 
CK2  24-12-2012 30-12-2012  1800  2 

Und vielleicht führen sein, gibt es eine Möglichkeit, um herauszufinden, wie viele Datensätze nicht 0 wegen Status == gruppiert wurden? Das ist nicht sehr wichtig, ich frage mich nur, ob es einen Weg gibt, wie man die Anzahl der unzähligen Datensätze für eine Gruppe von Datensätzen herausfinden kann.

+0

Thi s Frage scheint vertraut ... http://stackoverflow.com/questions/9885879/how-to-group-and-choose-lowest-value-in-sql Arbeiten Sie uns durch Ihre Hausaufgabe? –

+0

Ja und nein, ich habe gestern mit der Lösung herumgespielt, kann aber keine Lösung finden, wenn ich rechnen möchte. Ich wollte die bestehende Frage nicht ändern, wenn ich irgendwelche Regeln gebrochen habe, werde ich diese Frage hier löschen. – feronovak

Antwort

2

Ihre Beschreibung nicht übereinstimmt, was Sie das Ergebnis sein soll.

Dies wird Ihre Beschreibung, also gibt Ihnen den niedrigsten Preis entspricht den Status 1 ist, und die Anzahl der Datensätze in der Gruppe zählen:

select id, date_from, date_to, min(case status when 1 then price end) as price, count(*) as count 
from TheTable 
group by id, date_from, date_to 

Ergebnis:

id | date_from | date_to  | price | count 
CK1  22-12-2012 29-12-2012  800  2 
CK2  24-12-2012 30-12-2012  1800  3 

Dies gibt Sie ist das Ergebnis, das Sie gefragt, dh die Datensätze herauszufiltern, wo Status 1 ist, dass Sie den niedrigsten Preis bekommen, und die Anzahl der Datensätze in den Gruppen nach dem filtern erhalten:

select id, date_from, date_to, min(price) as price, count(*) as count 
from TheTable 
where status = 1 
group by id, date_from, date_to 

Ergebnis:

id | date_from | date_to  | price | count 
CK1  22-12-2012 29-12-2012  800  2 
CK2  24-12-2012 30-12-2012  1800  2 

Um die Anzahl der Datensätze zu erhalten, wo der Status 0 ist, müssen Sie die erste Methode verwenden, in denen Sie nicht die Datensätze herauszufiltern. Wenn der Status nur 0 oder 1 sein kann, können Sie einfach sum(status) verwenden, um die Anzahl der Datensätze zu erhalten, wo der Status 1 ist, und count(case status when 0 then 1 end) oder sum(1 - status) die Anzahl der Datensätze zu erhalten, wo der Status 0 ist

0

Vielleicht so etwas wie folgt aus:

Testdaten

DECLARE @tbl TABLE 
(
    id VARCHAR(100), 
    date_from VARCHAR(100), 
    date_to VARCHAR(100), 
    price INT, 
    status INT 
) 

INSERT INTO @tbl 
VALUES 
    ('CK1','22-12-2012','29-12-2012',800,1), 
    ('CK1','22-12-2012','29-12-2012',1200,1), 
    ('CK2','22-12-2012','29-12-2012',1400,0), 
    ('CK2','22-12-2012','29-12-2012',1800,1), 
    ('CK2','22-12-2012','29-12-2012',2200,1) 

Abfrage

;WITH CTE 
AS 
(
    SELECT 
     ROW_NUMBER() OVER(PARTITION BY tbl.id ORDER BY tbl.price ASC) AS RowNbr, 
     SUM(status) OVER(PARTITION BY tbl.id) AS [count], 
     tbl.* 
    FROM 
     @tbl AS tbl 
    WHERE 
     status=1 
) 
SELECT 
    CTE.id, 
    CTE.date_from, 
    CTE.date_to, 
    CTE.price, 
    CTE.[count] 
FROM 
    CTE 
WHERE 
    CTE.RowNbr=1 
Verwandte Themen