2016-06-08 14 views
1

i eine Tabelle haben, bestehen Fruchtgruppen und Größen dh:Abfrage in Server Management Studio + Tabelle in SSRS Berichte + -verwenden wählen mit korrelierten Unterabfrage

      send   send 
**fruit-package/size/start-date/ end-date/ ** 
-------------------------------------------------- 
apple   s   2.2.16   5.2.16 
apple   s   7.2.16   **10.2.16** 
apple   s   **20.2.16**   21.2.16 
-------------------------------------------------- 
apple   l    1.2.16  **5.2.16** 
apple   l   **25.2.16**  26.2.16 
apple   l   26.2.16  27.2.16 
------------------------------------------------- 
orange   m    1.1.16  2.1.16  
orange   m    3.1.16  **4.1.16** 
orange   m    **24.1.16** 25.1.16 
--------------------------------------------------- 

ich brauche, für jede spezifische Gruppe von Obst -Paket und Größe (wie Apfel + klein), um die max Tage in der Gruppe zu finden, übergeben zwischen ein Paket Send-End-Datum an das folgende Paket, in der Gruppe, Send-Start-Tag und Wählen Sie dann das Send-End-Datum und folgen Sie dem Startdatum und berechnen Sie , dass max diff zwischen diesen beiden Werten und setzen sie in der Ergebnistabelle für die jeweilige Gruppe, tut es für jede Gruppe

so die Ergebnistabelle wäre

       send   send 
**fruit-package/ size/start-date/end-date/ ** 
-------------------------------------------------- 
apple    s  20.2.16  10.2.16      
--------------------------------------------------        

apple    l  25.2.16  5.2.16 
------------------------------------------------- 
orange    m  24.1.16  4.1.16 

--------------------------------------------------- 

Ich habe versucht, diese in Teilen zu tun. ersten Teil: für jede Gruppe von Obst - alle Kombination von:

(Obst-Paket) + (Größe) + (Strom end_date) und der start_date des Pakets folgen wie folgt aus:

select P.fruit 
,P.size 
,P.end_date 

,(SELECT top 1 (pa.start_date) 
    FROM packages as pa 
    WHERE pa.start_date >= pa.end_date 
    and p.fruit=pa.fruit and p.size=pa.size 
    order by pa.start_date desc ) as start  


    into #temp 

from packages p 


group by p.fruit 
, P.size 
,p.end_date 

und zweite Schritt wäre, finden simplly die Zeile mit dem größten Tag-diff in jeder Gruppe

aber den ersten Teil werde ich nicht Nullwert geschrieben Arbeits- als Starttermin bekam, oder ein end_date und nicht für jede Gruppe von innen wählen Sie - warum und , wie Sie es korrigieren?

bitte helfen

dank

Antwort

1

Dies sollte für Sie arbeiten, wenn Sie 2012 oder später.

Create Table #Tbl (Name Varchar(8000), Size Char(1), StartDate Date, EndDate Date) 
Insert #Tbl Values ('apple', 's', '2.2.16', '2.5.16') 
Insert #Tbl Values ('apple', 's', '2.7.16', '2.10.16') 
Insert #Tbl Values ('apple', 's', '2.20.16', '2.21.16') 
Insert #Tbl Values ('apple', 'l', '2.1.16', '2.5.16') 
Insert #Tbl Values ('apple', 'l', '2.25.16', '2.26.16') 
Insert #Tbl Values ('apple', 'l', '2.26.16', '2.27.16') 
Insert #Tbl Values ('orange', 'm', '1.1.16', '1.2.16') 
Insert #Tbl Values ('orange', 'm', '1.3.16', '1.4.16') 
Insert #Tbl Values ('orange', 'm', '1.24.16', '1.25.16') 

;With cteQry As 
(
Select *, 
     Lead(StartDate) Over (Partition By Name, Size Order By StartDate) NextStartDate, 
     DateDiff(d, EndDate, Lead(StartDate) Over (Partition By Name, Size Order By StartDate)) Days 
    From #Tbl 
) 
Select * 
    From 
     (
     Select *, 
       Row_Number() Over (Partition By Name, Size Order By Days Desc) SortOrder 
      From cteQry 
     ) A 
    Where SortOrder = 1 

EDIT: Ohne Bleifunktion.

;With cteQry2 As 
(
Select *, 
      DateDiff(d, EndDate, 
       (Select Top 1 StartDate 
        From #Tbl 
        Where Name = T1.Name 
          And Size = T1.Size 
          And StartDate > T1.StartDate 
        Order By StartDate)) Days 
    From #Tbl T1 
) 
Select * 
    From 
     (
     Select *, 
       Row_Number() Over (Partition By Name, Size Order By Days Desc) SortOrder 
      From cteQry2 
     ) A 
    Where SortOrder = 1 
    Order By Name, Size, StartDate 
+0

schöne antwort, vielen dank !! :), aber ich überprüfe, und es scheint zu sein, dass ich sql 2012 nicht verwenden darf, es wird nicht mit dem ganzen System korrelieren, also habe ich nicht die Lead() Funktion, könnten Sie bitte helfen, umzuschreiben passt es zu SQL 2008? Danke vielmals!! – liori

+0

Ich habe eine Abfrage hinzugefügt, die nicht die Lead-Funktion verwendet, also sollte für Sie auf 2008 arbeiten. –

+0

Vielen Dank, es hat sehr geholfen :), du bist der Beste! – liori