Stored procedures er også meget anvendt i SQL-Server, men i dit eksempel bruger du funktioner og ikke stored procedures.
Hvis du har brug for flere kolonner fra din tabel joiner du bare på den igen.
- SELECT h.a, h.b, hg.HOURS, hg.DAYS
- FROM dbo.HISTORICAL_BALANCE AS h
- INNER JOIN (SELECT h.TRANSACTION_ID,
- ISNULL(SUM(h.HOURS), 0) AS HOURS,
- ISNULL(SUM(h.DAYS), 0) AS DAYS
- FROM dbo.HISTORICAL_BALANCE AS h
- GROUP BY h.TRANSACTION_ID) AS hg
- ON h.TRANSACTION_ID = hg.TRANSACTION_ID
Kigger jeg i management studio ligger de nu under stored procedures og ikke functions - men hvad ved jeg :-)
Hvis dit eksempel skal bygges ind i dette sql-script, kan det så lade sig gøre?
- SELECT
- ht.ID,
- ht.APP_USER_ID,
- ht.DEPARTMENT_NAME
-
- FROM
- dbo.APP_USER AS a INNER JOIN
- dbo.HISTORICAL_TRANSACTION AS ht LEFT OUTER JOIN
- dbo.WAGE_PERIOD AS wp ON wp.ID = ht.WAGE_PERIOD_ID ON a.ID = ht.APP_USER_ID
-
- WHERE
- (ht.ABSENCE_CANCEL_STATUS IS NULL) OR (ht.ABSENCE_CANCEL_STATUS = 0)
Jeg har selvfølige forsøgt, men det fejler på din sidste linje "ON h.transaction...." med at h.transaction_id ikke findes. Og den findes fint nok i historical_balance*edit*
Nu fik jeg brygget dette sammen:
- SELECT
- ht.ID,
- ht.APP_USER_ID,
- ht.DEPARTMENT_NAME,
- hg.hours,
- hg.DAYS
-
- FROM
- (dbo.HISTORICAL_BALANCE AS h
- INNER JOIN (SELECT h.TRANSACTION_ID,
- ISNULL(SUM(h.HOURS), 0) AS HOURS,
- ISNULL(SUM(h.DAYS), 0) AS DAYS
- FROM dbo.HISTORICAL_BALANCE AS h
- GROUP BY h.TRANSACTION_ID) AS hg
- ON h.TRANSACTION_ID = hg.TRANSACTION_ID),
-
- dbo.APP_USER AS a INNER JOIN
- dbo.HISTORICAL_TRANSACTION AS ht LEFT OUTER JOIN
- dbo.WAGE_PERIOD AS wp ON wp.ID = ht.WAGE_PERIOD_ID ON a.ID = ht.APP_USER_ID
-
- WHERE
- (ht.ABSENCE_CANCEL_STATUS IS NULL) OR (ht.ABSENCE_CANCEL_STATUS = 0)
Men den returnerer samme værdi for alle rækker i hg.hours og hg.days :-( og den kører lige så lang tid som mit oprindelige script.
Indlæg senest redigeret d. 07.09.2012 20:24 af Bruger #9814