[MS SQL] Wyszukanie tytułu kolumny

0

Czołem
Dziś natknąłem się na problem w którym wykonuje obliczenie dla każdego wiersza i wychodzą mi różne wyniki ( int)
następnie muszę ten wynik wyszukać w tytule kolumny w innej tabeli i go podać

  1. sprawdzam w jakim tygodniu sprzedaży jest dany tytuł
    * gdy nie mial sprzedaży to 1
    * gdy jest starszy niż 40 tygodni to 1

gdy jest mniejszy lub równy 40 to potrzebuje znaleźć wartość dla tej tematyki w tytułach
czyli z obliczenia wyszło że tydzień w którym znajduje się produkt to tydzień nr 10 więc teraz chciałbym odnieść sie do tabeli "tematyki" i wyszukać tt.10 ....

ale niestety ciągle błędy ;/



 SELECT 

aa.Indeks,

aa.Data_I_spr,

CASE	when
			CAST(GETDATE()-CAST((aa.Data_I_spr)AS DATETIME)AS INT)/7 IS NULL THEN 1
		WHEN
			CAST(GETDATE()-CAST((aa.Data_I_spr)AS DATETIME)AS INT)/7 >40 then 1
		
		WHEN 
			CAST(GETDATE()-CAST((aa.Data_I_spr)AS DATETIME)AS INT)/7 <=40 then  
												  tt.(CAST( CAST(GETDATE()-CAST((aa.Data_I_spr)AS DATETIME)AS INT)/7)


		end

from [czarnamamba].[analizy].dbo.tytuly as aa
LEFT JOIN dbo.Trend_tematyka as  tt ON aa.tematyka=tt.tematyka

tabela tematyka wyglada w ten sposób :
screenshot-20191024075010.png

1

Do obliczanie różnic między datami używaj DATEDIFF:

SELECT DATEDIFF(week, '2019/10/25', '2019/11/29') AS LiczbaTygodni;

Co Twoim zdaniem zwraca ta część:

tt.(CAST( CAST(GETDATE()-CAST((aa.Data_I_spr)AS DATETIME)AS INT)/7)

Gdzieś na forum był podobny temat kiedyś poszukaj może znajdziesz tam od razu odpowiedź.

0

Nie osiągniesz tego w ten sposób, żeby "zmienna" robiła za zwracana kolumne, musisz bardziej rozbudować tego casea:

 SELECT 
	aa.Indeks,
	aa.Data_I_spr,
	CASE  CAST(GETDATE()-CAST((aa.Data_I_spr)AS DATETIME)AS INT)/7
		when 2 then [2]
		when 3 then [3]
		when 4 then [4]
		--tu warunki do 40
		else [1]
	end
from 
	[czarnamamba].[analizy].dbo.tytuly as aa
	LEFT JOIN dbo.Trend_tematyka as  tt ON aa.tematyka=tt.tematyka

I jeszcze uwaga, jeżeli kolumna ma w nazwie same cyfry to musisz je umieścić w nawiasach kwadratowych, w przeciwnym wypadku zwrócona zostanie wartość numeryczna, a nie zawartość kolumny.

0

a tak w ogóle dla takiego wyszukiwania baza powinna mieć inną strukturę

0

@abrakadaber to znaczy jaką ?
spokojnie mogę ja transponować albo zmienić bo wczoraj zrobiłem taka formę myśląc że to jest wlaściwe ...

@Panczo dzięki zaraz to przetestuje

@BlackBad dzięki za rade odnośnie datediff

 ( tt.(CAST( CAST(GETDATE()-CAST((aa.Data_I_spr)AS DATETIME)AS INT)/7)

a część miała zwracać wynik np 5 żeby wyszukać 5 tydzień od wejścia do sprzedaży

0

zamiast kolumn z nazwami a01 do a40 (czy jak je tam masz) to tabela z kolumnami id, tematyka, nazwa, wartosc i bezproblemowo tworzysz warunek do zapytania bez drabinki caseów

0

No fakt można to "uprościc" wykorzystując unpivota:

with tt as (
SELECT tematyka, tydzien, wartosc  
FROM   
--nie chce mi sie pisać pełnego unpivota, musisz wylistowąć wszystkie kolumny do 40 tu i poniżej
   (SELECT tematyka, [1],[2],[3],[4],[5]  
   FROM dbo.Trend_tematyka) p  
UNPIVOT  
   (wartosc FOR tydzien IN   
      ([1],[2],[3],[4],[5])  
)AS unpvt), aa as (
select
	*
	,CAST(GETDATE()-CAST((Data_I_spr)AS DATETIME)AS INT)/7 as tygodnie
from
    [czarnamamba].[analizy].dbo.tytuly
	)

SELECT 
    aa.Data_I_spr,
    tt.wartosc
from 
    aa
    LEFT JOIN  tt ON aa.tematyka=tt.tematyka 
					and (
						(aa.tygodnie between 1 and 40 and aa.tygodnie = tt.tydzien)
						or
						((aa.tygodnie < 1 or aa.tygodnie > 40) and tt.tydzien=1)
						)
GO  

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