Avatar billede anders_cp Nybegynder
25. juni 2008 - 14:28 Der 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?
Avatar billede aaberg Nybegynder
25. juni 2008 - 14:43 #1
Ligger PartNumber i begge tabellerne?
Avatar billede anders_cp Nybegynder
25. juni 2008 - 14:55 #2
Nej, PartNumber ligger kun i PartSupplies-tabellen
Avatar billede aaberg Nybegynder
25. juni 2008 - 15:00 #3
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
Avatar billede aaberg Nybegynder
25. juni 2008 - 15:02 #4
Rettelse. Prøv dette i stedet:

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
Avatar billede anders_cp Nybegynder
25. juni 2008 - 15:23 #5
Den brokker sig over "with tbl as"

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.
Avatar billede anders_cp Nybegynder
25. juni 2008 - 15:24 #6
ACTIVITY-tabel
ActivityID,
      ActivityTypeID,
      ContactName,
      CustomerName,
      StreetName1,
      StreetName2,
      PostalCode,
      CountryID,
      Phone,
      Fax,
      OpeningHours,
      Note,
      VendorID,
      ProductID,
      SerialNumber,
      InstallDate,
      Task,
      VendorReferenceNumber,
      CustomerReferenceNumber,
      DeliveryAddressDifferent,
      DeliveryContactName,
      DeliveryCustomerName,
      DeliveryStreetName,
      DeliveryPostalCode,
      DeliveryCity,
      InvoiceAddressDifferent,
      InvoiceContactName,
      InvoiceCustomerName,
      InvoiceStreetName,
      InvoicePostalCode,
      InvoiceCity,
      InvoiceNote,
      PaymentTypeID,
      [Counter],
      CarrierID,
      CarrierReference,
      ProductReceivedDate,
      ProductSendDate,
      ActivityStartDateTime,
      ActivityEndDateTime,
      ActivityExecuteDateTime,
      ActivityDuration,
      RepairDescription,
      CustomerPrice,
      WorkshopRepairDays,
      RecallDays,
      RecallPreviousUserID,
      RecallControlStatusID,
      ActivityVerified,
      ActivityInvoiced,
      ActivityClosed,
      UserID,
      [TimeStamp],
      NoteVIP,
      Email,
      VendorEmail,
      Eta,
      Vip,
      WarrantyEndDate,
      NewPrice,
      AcquisitionPrice,
      MaxIndemnityPrice,
      InvoiceNumber,
      InvoiceDate,
      InvoiceValue,
      ActivityDetailID,
      VendorReferenceTypeID,
      ErrorCode,
      PartnerID,
      VendorServiceTypeID,
      VendorCustomerServiceTypeID,
      WarrantyTypeID,
      WorkFlowID,
      WorkFlowDateTime,
      UsedPrice,
      ProductDescription,
      EtaStartDateTime,
      EtaEndDateTime,
      CustomerID,
      VendorInvoiceReference,
      VendorInvoicePrice,
      BusinessCustomerID,
      SPContactName,
      SPPhone,
      SPFax,
      SPEmail,
      WorkFlowNote
Avatar billede anders_cp Nybegynder
25. juni 2008 - 15:25 #7
PARTSUPPLIES-tabellen

PartSupplyID,
              PartOrderID,
              ActivityID,
              PaymentTypeID,
              PartVendorID,
              PartNumber,
              PartName,
              WareHouseID,
              PartSupplyStatusID,
              Number,
              Price,
              PartOwnerUserID,
              UserID,
              DateTimeStamp,
              DoNotReturn,
              Note
Avatar billede aaberg Nybegynder
25. juni 2008 - 15:35 #8
Er det SQL server 2000? "with tbl as" kan nemlig først bruges i SQL server 2005.

Jeg skal se lidt mere på det senere i dag. Vi finder sikkert ud af det :-)
Avatar billede pidgeot Nybegynder
25. juni 2008 - 15:36 #9
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

*går igen*
Avatar billede anders_cp Nybegynder
25. juni 2008 - 15:44 #10
Ja, det er en gammel sql-server. På sql-server 2005 (som desværre kun ligger lokalt på min maskine) finder den rigtigt nok ud af "with tbl as"

Glæder mig du kan hjælpe mig!
Avatar billede anders_cp Nybegynder
25. juni 2008 - 15:59 #11
pidgeot -> Dit forslag fjerner dubletterne (hvad det IKKE må).
Avatar billede aaberg Nybegynder
25. juni 2008 - 22:23 #12
Nu har jeg prøvet at oprette nogle test-tabeller og putte nogle data i. Jeg får rigtigt resultat med begge dine queries!
Avatar billede anders_cp Nybegynder
25. juni 2008 - 23:46 #13
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):
Avatar billede anders_cp Nybegynder
02. februar 2010 - 22:15 #14
Jeg tillader mig at lukke. Er ikke aktuelt længere.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester