Visual basic-helv...

Lurch

Partiellt rupturerad
Gick med
6 Mar 2003
Ort
Hemmavid
Hoj
Suzuki GSX-R 750
Noob på sql och sånt. Håller på att försöka sortera ut ett antal företagsnamn mm. Företagen har status aktiv eller inaktiv, jag vill bara ha de aktiva. Jag tror att jag måste ta ut de rader som har status A, men eftersom ett företag kan ha gått från A till I eller från I till A så måste jag endast ta ut den senaste statusändringen. Begripligt?

Problemet är att jag får ett felmeddelande:

"Conversion failed when converting datetime from character string"

Datumformatet i ProducerStatus_1.Date är "2008-12-05 10:30:45"

Åtgärd på denna?

SELECT dbo.Producers.CIN, dbo.Producers.Name, ProducerStatus_1.Status, ProducerStatus_1.Date
FROM dbo.Producers INNER JOIN
dbo.ProducerStatus AS ProducerStatus_1 ON dbo.Producers.CIN = ProducerStatus_1.CIN
WHERE (ProducerStatus_1.Status IN
(SELECT TOP (1) Date
FROM dbo.ProducerStatus AS ProducerStatus_1
WHERE (Status = 'A')))




Hilfe...
 
Last edited:
Du försöker omvandla "Status" till Datum?

Edit, ser att din top 1 inte har någon order by i din subfråga så datumet du får ut är slumpmässigt valt.

Notera även att frågan kommer att bli rätt ineffektiv om du har många rader i tabellen.

Kanske bättre att använda en CTE eller en temp tabell och plocka ut högsta datum + företag id och sedan joina på dessa för att plocka ut statusen?

Edit2: Tittar lite till och är lite tveksam till om den öht skulle gå genom kompilatorn även om du rättar till Status och datum, men man kan aldrig veta med SQL:)

Edit3: eftersom jag inte hade något att göra, par exempel på hur du kan göra

Create table PRODUCERS (PRODUCER_ID UNIQUEIDENTIFIER, PRODUCER_NAME VARCHAR(100))
GO
CREATE TABLE PRODUCER_STATUS(PRODUCER_ID UNIQUEIDENTIFIER, [STATUS] CHAR(1), CHANGE_DATE DATETIME)
GO
INSERT INTO PRODUCERS(PRODUCER_ID,PRODUCER_NAME)
SELECT TOP 100 NEWID(),NAME
FROM SYSOBJECTS
GO
-- KÖR NEDANSTÅENDE NÅGRA GÅNGER MED NÅGRA SEKUNDERS MELLANRUM FÖR ATT FYLLA TABELLEN, BYT UT STATUS MELLAN A OCH I
-- AVSLUTA MED I SOM STATUS
INSERT INTO PRODUCER_STATUS
SELECT P.PRODUCER_ID,'A', GETDATE()
FROM PRODUCERS P

GO
--FÖR ATT FÅ 13 MED STATUSEN AKTIV
INSERT INTO PRODUCER_STATUS
SELECT TOP 13 P.PRODUCER_ID,'A', GETDATE()
FROM PRODUCERS P


--UNDERFRÅGE VARIANT

SELECT P.PRODUCER_ID,P.PRODUCER_NAME,PSUB.MAX_DATE ,PS.STATUS FROM
PRODUCERS P
INNER JOIN
(SELECT MAX(CHANGE_DATE) AS MAX_DATE, PRODUCER_ID
FROM PRODUCER_STATUS
GROUP BY PRODUCER_ID) PSUB
ON PSUB.PRODUCER_ID = P.PRODUCER_ID
INNER JOIN PRODUCER_STATUS PS
ON PSUB.MAX_DATE = PS.CHANGE_DATE
AND PS.PRODUCER_ID = PSUB.PRODUCER_ID
AND P.PRODUCER_ID = PS.PRODUCER_ID
AND PS.STATUS='A'


eller om databasen inte är från stenåldern, använd rank funktionen


select P.producer_id,p.producer_name,sub.change_date from
(
select ps.producer_id,ps.change_date,ps.status, rank()
over (partition by ps.producer_id order by ps.change_date desc) as rank
from producer_status ps ) sub
inner join producers p
on sub.producer_id=p.producer_id
where sub.rank = 1 and sub.status = 'A'
 
Last edited:
Kan du köra dessa två rader så man fattar lite vad det handlar om så ska det nog gå att fnula ihop någon SQL åt dig :)

DESCRIBE dbo.Producers;

DESCRIBE dbo.ProducerStatus;




Edit: Eller det behövs nog inte, hang in there
 
Last edited:
Hm, vare sig create table eller over funkar. Not supported.

Testa detta:

SELECT p.cin, p.name,ps.Status,ps.Date
FROM dbo.producers AS p
JOIN dbo.producerstatus AS ps ON ps.cin=p.cin AND ps.date=
(SELECT MAX(date)
From dbo.producers
where dbo.producers.CIN=p.CIN)
WHERE ps.status='A'
 
Testa detta:

SELECT p.cin, p.name,ps.Status,ps.Date
FROM dbo.producers AS p
JOIN dbo.producerstatus AS ps ON ps.cin=p.cin AND ps.date=
(SELECT MAX(date)
From dbo.producers
where dbo.producers.CIN=p.CIN)
WHERE ps.status='A'

Ser paj ut ;)

Hinner inte kolla mer just nu, men jag började med en query som bör funka för att lista alla senaste statusar. Om du inte får till det kan jag kolla mer i eftermiddag

select s.CIN, s.Date, s.Status
from(
select max(Date) as maxdate, CIN
from dbo.ProducerStatus group by CIN;
) as x inner join dbo.ProducerStatus as s on s.CIN = x.CIN and s.Date = x.maxdate;
 
Last edited:

Vaere som är fel då? :va
Borde funka. :fakta

I brist på riktig databas är det givetvis svårt att testköra sheiten..


SELECT p.cin, p.name,ps.Status,ps.Date
FROM dbo.producers AS p
JOIN dbo.producerstatus AS ps ON ps.CIN=p.CIN AND DATE=
(SELECT MAX(date)
From dbo.producers as p2
where p2.CIN=p.CIN)
WHERE ps.status='A'
 
Last edited:
Testa detta:

SELECT p.cin, p.name,ps.Status,ps.Date
FROM dbo.producers AS p
JOIN dbo.producerstatus AS ps ON ps.cin=p.cin AND ps.date=
(SELECT MAX(date)
From dbo.producers
where dbo.producers.CIN=p.CIN)
WHERE ps.status='A'

En liten varning för den typen av frågor, då underfrågan kan komma att ställas en gång för varje rad i den yttre frågan = prestandaproblem om man har mycket data.(beror i.o.f.s på hur effektiv optimeraren är)
Dessutom kommer den bara att köra på fält som har status 'A' och du får fram en lista på när företagen var 'A' på det maximala datumet i tabellen , tror jag ( ingen db framför mig just nu)

Vill också påpeka att båda mina exempel är skrivna för SQL2008R2 och de fungerar, men exempel 1 "borde" fungera i alla databaser då den, vad jag vet, inte använder någon specialfunktion.
 
Last edited:
Vaere som är fel då? :va
Borde funka. :fakta

I brist på riktig databas är det givetvis svårt att testköra sheiten..


SELECT p.cin, p.name,ps.Status,ps.Date
FROM dbo.producers AS p
JOIN dbo.producerstatus AS ps ON ps.CIN=p.CIN AND DATE=
(SELECT MAX(date)
From dbo.producers as p2
where p2.CIN=p.CIN)
WHERE ps.status='A'

Du måste ta ut max unikt datum per cin och nu tar du bara ut max unikt datum ur hela tabellen, jag kan ha fel
 
Funkar hyfsat men...

Vaere som är fel då? :va
Borde funka. :fakta

I brist på riktig databas är det givetvis svårt att testköra sheiten..


SELECT p.cin, p.name,ps.Status,ps.Date
FROM dbo.producers AS p
JOIN dbo.producerstatus AS ps ON ps.CIN=p.CIN AND DATE=
(SELECT MAX(date)
From dbo.producers as p2
where p2.CIN=p.CIN)
WHERE ps.status='A'
 

Bifogat

  • sql1.JPG
    sql1.JPG
    30.7 KB · Visningar: 33
Nyheter
Mälaren Runt fyller 40 år

Nu på lördagen den 15 augus...

Steve Holcombe klar för GGN!

Pressmeddelande 2026-08-10 ...

Nya Chief Vintage Sturgis

I samband med 86:e Sturgis ...

Missa inte Bikes sommarnummer!

Innehåll Bike powered by...

Missa inte Bikes sommarnummer!

Innehåll Bike powered by...

Shelby Turner, klar för GGN

Pressmeddelande 2026-08-05F...

Premiär för Östgöta Dundret

Under 1940 talet var Finspå...

Ny 500-kubiks retro från Honda

Efter rykten om en ny retro...

Ny 500-kubiks retro från Honda

Efter rykten om en ny retro...

Ny 500-kubiks retro från Honda

Efter rykten om en ny retro...

Back
Top