25. juni 2008 - 14:28Der er
13 kommentarer og 1 løsning
Group-by-ting
Hej Jeg får ikke det ønskede resultat. Jeg tror det skyldes min group-by-ting
Følgende sql:
SELECT SerialNumber, SUBSTRING(PartNumber, dbo.LASTINDEX(PartNumber, '.'), 8000) AS Partnumber, COUNT(*) AS Reparationer , 6 AS Period FROM partsupplies INNER JOIN Activities ON PartSupplies.ActivityID = Activities.ActivityID WHERE PartVendorID = 2 AND Activities.ActivityEndDateTime > GETDATE() - 6 * 30 GROUP BY SUBSTRING(PartNumber, dbo.LASTINDEX(PartNumber, '.'), 8000), Activities.SerialNumber HAVING COUNT(*) > 1 ORDER BY Activities.SerialNumber
Giver bl.a. Serialnumber partnumber rep mdr 3942160031 UWL:82-UG8000-00C 3 6 3942160031 UWL:82-UG8000-A1 2 6
altså to ens serienumre, hvilket er ok. Nu vil jeg have tilføjet aktivitetsnummer som findes i både PartSupplies-tabellen og Aktivitetstabellen. Jeg har ændret sql'en således:
SELECT Activities.SerialNumber, SUBSTRING(PartSupplies.PartNumber, dbo.LASTINDEX(PartSupplies.PartNumber, '.'), 8000) AS Partnumber, COUNT(*) AS Reparationer, 6 AS Period, PartSupplies.ActivityID FROM PartSupplies INNER JOIN Activities ON PartSupplies.ActivityID = Activities.ActivityID WHERE (PartSupplies.PartVendorID = 2) AND (Activities.ActivityEndDateTime > GETDATE() - 6 * 30) GROUP BY SUBSTRING(PartSupplies.PartNumber, dbo.LASTINDEX(PartSupplies.PartNumber, '.'), 8000), Activities.SerialNumber, PartSupplies.ActivityID HAVING (COUNT(*) > 1) ORDER BY Activities.SerialNumber
Hvilket giver mig den ønskede activitesid, MEN samtidig fjerner dubletter. serienr. partnr. rep mdr activityid 3942160031 UWL:82-UG8000-00C 3 6 200288
Hvordan får jeg kreeret et resultat som det første, men med activityid'et inkl?
Nu har jeg ikke mulighed for at teste den da jeg ikke har tabellerne, men prøv dette:
with tbl as ( SELECT SerialNumber, SUBSTRING(PartNumber, dbo.LASTINDEX(PartNumber, '.'), 8000) AS Partnumber, COUNT(*) AS Reparationer , 6 AS Period, PartSuppliers.ActivityID FROM partsupplies INNER JOIN Activities ON PartSupplies.ActivityID = Activities.ActivityID WHERE PartVendorID = 2 AND Activities.ActivityEndDateTime > GETDATE() - 6 * 30 order by Activities.SerialNumber) select SerialNumber, Partnumber, Reparationer, Period, ActivityID from tbl group by SerialNumber, Partnumber, Reparationer, Period, ActivityID having count(*) > 1
with tbl as ( SELECT SerialNumber, SUBSTRING(PartNumber, dbo.LASTINDEX(PartNumber, '.'), 8000) AS Partnumber, 6 AS Period, PartSuppliers.ActivityID FROM partsupplies INNER JOIN Activities ON PartSupplies.ActivityID = Activities.ActivityID WHERE PartVendorID = 2 AND Activities.ActivityEndDateTime > GETDATE() - 6 * 30 order by Activities.SerialNumber) select SerialNumber, Partnumber, Period, ActivityID, count(*) as Reparationer from tbl group by SerialNumber, Partnumber, Period, ActivityID having count(*) > 1
Msg 156, Level 15, State 1, Line 1 Incorrect syntax near the keyword 'with'. Msg 156, Level 15, State 1, Line 9 Incorrect syntax near the keyword 'order'.
Det er temmelig store tabeller, ellers ville jeg gerne have sendt dem.
Om ikke andet kunne man måske bare flytte den ned til FROM'en, så man undgår WITH:
select SerialNumber, Partnumber, Period, ActivityID, count(*) as Reparationer from (SELECT SerialNumber, SUBSTRING(PartNumber, dbo.LASTINDEX(PartNumber, '.'), 8000) AS Partnumber, 6 AS Period, PartSuppliers.ActivityID FROM partsupplies INNER JOIN Activities ON PartSupplies.ActivityID = Activities.ActivityID WHERE PartVendorID = 2 AND Activities.ActivityEndDateTime > GETDATE() - 6 * 30 order by Activities.SerialNumber) tbl group by SerialNumber, Partnumber, Period, ActivityID having count(*) > 1
hmm. Men det er desværre ikke rigtigt. Det er noget jeg skulle have lavet til i morgen på mit job. Jeg ser lige om jeg får forlænget spilletid, og vil i så tilfælde lave nogle tabeller, så du bedre kan forstå hvor jeg vil hen.
Jeg takker for nu, men vil vende tilbage om et par dage (hvis du i mellemtiden finder en løsning vil jeg dog stadig interesseret og taknemmelig):
Jeg tillader mig at lukke. Er ikke aktuelt længere.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.