Ms SQL i tworzenie kwerendy

0

<image>Pytanie.png </image>

 SELECT [TrR_TrRId]
      ,[TrR_TrNTyp]
      ,[TrR_TrNId]
      ,[TrR_FaTyp]
      ,[TrR_FaId]
      ,[TrR_Flaga]
	  ,[TrN_TrNID]
	  ,[TrN_NumerPelny]
	  ,[TrN_DataWys]
  FROM [CDN].[TraNagRelacje] JOIN [CDN].[TraNag] ON [TrN_TrNID] = [TrR_FaId] WHERE [TrR_FaTyp] = 306 AND [TrR_TrNTyp] = 308
  ORDER BY [TrR_TrNId], [TrN_DataWys] DESC

Witam,

Mam problem z poniższym zadaniem. Cel jest następujący: wyświetlanie linii na podstawie ID z najświeższą datą wystawienia dokumentu (TrN_DataWys). Zatem przykładowo, jeśli w kolumnie TrR_TrNId pojawi się trzykrotnie wartość 1, tak jak na załączonym zrzucie, to wyświetlona de facto powinna zostać tylko ta linia, która posiada najbardziej aktualną datę, a więc w prezentowanym przykładzie będzie to pierwszy rekord z TrR_TrNId = 1 i datą 2016-10-19 w TrN_DataWys. Posortowałem ID, datę (od najświeższej), ale mam problem z wyświetleniem TYLKO jednego najświeższego rekordu. Z góry dziękuję za pomoc.

0
 SELECT TOP 1 [TrR_TrRId]
      ,[TrR_TrNTyp]
      ,[TrR_TrNId]
      ,[TrR_FaTyp]
      ,[TrR_FaId]
      ,[TrR_Flaga]
      ,[TrN_TrNID]
      ,[TrN_NumerPelny]
      ,[TrN_DataWys]
  FROM [CDN].[TraNagRelacje] JOIN [CDN].[TraNag] ON [TrN_TrNID] = [TrR_FaId] WHERE [TrR_FaTyp] = 306 AND [TrR_TrNTyp] = 308
  ORDER BY [TrR_TrNId], [TrN_DataWys] DESC
 

Ach ta baza Comarch'a. Nie cierpię tego nazewnictwa w XL'u, TrR_TrRId, TrR_TrNId ...

0

Niestety to nie zdaje egzaminu, już próbowałem. Problem w tym, że przy TOP 1 wyświetlenie ograniczy się tylko do jednego rekordu ogólnie. A co z pozostałymi numerami ID? Widoczny na screenie TrR_TrNId = 15 ma być widoczny. Chodzi tylko o to aby w przypadku kilku takich samych ID, ma pojawiać się ten z najbardziej aktualną datą (Stąd uzyte grupowanie od najświeższego, do najstarszego).

0

Widoczny na screenie TrR_TrNId = 11 ma być widoczny

0

Nie wystarczy Ci GROUP BY TrR_TrNId i Max(TrN_DataWys)?

0
 SELECT [TrR_TrRId]
      ,[TrR_TrNTyp]
      ,[TrR_TrNId]
      ,[TrR_FaTyp]
      ,[TrR_FaId]
      ,[TrR_Flaga]
	  ,[TrN_TrNID]
	  ,[TrN_NumerPelny]
	  ,[TrN_DataWys]
  FROM [CDN].[TraNagRelacje] JOIN [CDN].[TraNag] ON [TrN_TrNID] = [TrR_FaId] WHERE [TrR_FaTyp] = 306 AND [TrR_TrNTyp] = 308
  GROUP BY [TrR_TrNId] 

Przy poleceniu GROUP BY wyrzuca błąd: "Msg 8120, Level 16, State 1, Line 3
Column 'CDN.TraNagRelacje.TrR_TrRId' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause."

0

wrzuć to sobie do podzapytania, dodaj row_number albo rank over(partition by ID order by Date) i wyciągnij tylko te wiersze które mają ten row_number/rank = 1

0

Dobra nie ogarnąłem o co Tobie chodziło. Spróbuj czegoś takiego - lekko sobie zmodyfikujesz nie znam struktury, a tych złączeń też nie bardzo mi się chciało dodawać. Widać jednak główną koncepcję. O ile dla Ciebie najbardziej aktualna data oznacza największą we wpisie. Jeżeli nie to trzeba zamiast MAX(Data) zrobić tak, żeby obliczać minimalną różnicę dni pomiędzy datą wpisu, a datą dzisiejszą pobieraną z serwera:

SELECT t.TrR_TrNId , t.TrN_DataWys
FROM (
      SELECT TrR_TrNId, MAX(TrN_DataWys) as MaxDate
      FROM [CDN].[TraNag]
      GROUP BY t.TrR_TrNId
) r
INNER JOIN [CDN].[TraNag] t
ON t.TrR_TrNId = r.TrR_TrNId AND t.TrN_DataWys = r.MaxDate
order by t.TrR_TrNId
 
0

Dziękuję za sugestię. Czy mógłbyś sformułować to podzapytanie i wkleić je do mojego kodu? Byłoby mi łatwiej to przeanalizować,a chciałbym to nie tylko wykonać, ale i zrozumieć. Z góry dziękuję.

0

Mariano, dziękuję serdecznie. Jutro będę testował to rozwiązanie.

0
SELECT [TrR_TrRId]
      ,[TrR_TrNTyp]
      ,[TrR_TrNId]
      ,[TrR_FaTyp]
      ,[TrR_FaId]
      ,[TrR_Flaga]
	  ,[TrN_TrNID]
	  ,[TrN_NumerPelny]
	  ,[TrN_DataWys]
  FROM 
	(SELECT ROW_NUMBER() over(order by [TrR_TrNId]) from [CDN].[TraNagRelacje] JOIN [CDN].[TraNag] ON [TrN_TrNID] = [TrR_FaId] WHERE row_number() = 1)
  [CDN].[TraNagRelacje] JOIN [CDN].[TraNag] ON [TrN_TrNID] = [TrR_FaId] WHERE [TrR_FaTyp] = 306 AND [TrR_TrNTyp] = 308 ORDER BY [TrR_TrNId],[TrN_DataWys] DESC 

fooimmanuel_cunt mogłbyś to przedstawić w kodzie? Bo próbuję i nie uzyskuję rezultatu:

0
SELECT DISTINCT
		[TrR_TrNId]
		from [CDN].[TraNagRelacje] 
SELECT
	   [TrR_TrNTyp]
      ,[TrR_TrRId]
      ,[TrR_FaTyp]
      ,[TrR_FaId]
      ,[TrR_Flaga]
	  ,[TrN_TrNID]
	  ,[TrR_TrNId]
	  ,[TrN_NumerPelny]
	  ,[TrN_DataWys]
  FROM
  [CDN].[TraNagRelacje] JOIN [CDN].[TraNag] ON [TrR_FaId] = [TrN_TrNID] WHERE [TrR_FaTyp] = 306 AND [TrR_TrNTyp] = 308  ORDER BY [TrR_TrNId],[TrN_DataWys] DESC
   

Jakiś pomysł? Powtarzam, mam już pogrupowane dane w tabelach i chcę aby wyświetlił mi tylko nie powtarzające się rekordy z kolumny TrR_TrNId. Użyłem polecenia SELECT DISTINCT na zaprezentowanej powyżej tabeli i dokładnie o taki efekt chodzi mi w przypadku poniższej. Tylko jak wpleść tę klauzulę w kod, aby to działało? Zalączam zdjęcie i dwa kody.

0
SELECT TrN_NumerPelny, TrR_TrNId, MAX(TrN_DataWys) AS Data_wystawienia
      FROM [CDN].[TraNag] JOIN [CDN].[TraNagRelacje] ON TrR_FaId = TrN_TrNId WHERE TrR_FaTyp = 306 AND [TrR_TrNTyp] = 308 GROUP BY TrR_TrNId 

Aktualizacja. Udało mi się sprawić, że wyświetlane są właściwe rekordy i obok nich data (górna tabela). Chciałbym jednak, aby znajdowała się obok również kolumna TrN_NumerPelny, tak jak w poniższej tabeli. Gdy jednak dopisuję w SELECT TrN_NumerPelny, pojawia się komunikat: "Column 'CDN.TraNag.TrN_NumerPelny' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.". Próbowałem nawet przekonwertować dane w kolumnie TrN_NumerPelny, bo zauważyłem, że komunikat powyższy pojawia się zawsze gdy stosuję GROUP BY przy próbie wyświetlenia wartości innych niż liczbowe (nie chodzi o grupowanie na ich podstawie, ale sam fakt obecności wartości nieliczbowej do wyświetlenia w SELECT). Proszę o pomoc, bo powoli tracę już koncepcję. W załączniku zdjęcia.

1 użytkowników online, w tym zalogowanych: 0, gości: 1