Search

onze sponsors

microsoft_logo.gif


 

computrain_logo.JPG

Forum Login | Register
   Forum

 

Subject: Hoe moet ik de query opzetten?
Prev Next
You are not authorized to post a reply.

Author Messages
Stephan BussingUser is Offline

Posts:67

31-03-2009 18:11:51 Alert 
Hoi, ik heb de volgende uitdaging onder mijn neus gekregen:

In een db waarin clienten zitten die gekoppeld zijn aan een lokatie (1-N). Tevens hebben deze clienten een behandelplan (dat wil zeggen dat zou moeten). Nu moet de de volgende gegevens opleveren

Voor elke locatie moet ik een percentage aangeven van clienten met een actief plan. In lokaties wordt ook een onderscheid gemaakt, nl. wonen of niet wonen. Er gelden hiervoor afwijkende regels. Dus -

- een client die op een woonafdeling zit en een actief plan heeft telt volledige mee. (deze query heb ik al)
- een client die op een niet wonen afdeling zit en maar een afdeling heeft, telt voor die afdeling 100% mee (deze query heb ik ook al)
- een client die op meerdere niet wonen afdelingen zit, en een actief plan heeft, telt mee naar ratio van het aantal afdelingen. Dus op twee afdelingen, dan 50% bij elke afdeling tellen.

Ik vraag mij dus af hoe ik die laatste query voor elkaar ga krijgen.

Ik heb nu een query die aangeeft voor hoeveel procent een client mee moet tellen

select ((100/Count(Location_Id))* 0.01),l.Client_Id
from dbo.ClientLocation l
join Client m on l.MextraClient_Id = m.ClientId
join IBPMain I on m.ClientId = I.Client_Id
join Location loc on l.Location_id = loc.LocationId
WHERE I.Status = 3 and loc.locationtype_id is null
group by l.Client_Id
having Count(Location_Id) >1
order by l.Client_Id

Dit geeft mij een lijst met clienten en voor hoeveel procent deze mee mogen tellen, maar ik heb natuurlijk ook het locationId nodig. Als ik dat erbij zet, dan krijg ik een foutmelding dat LocationId niet in een aggregate functie voorkomt en dus niet gebruikt kan worden. Hoe kan ik dit oplossen?

bedankt voor dehulp
Arjan FraaijUser is Offline

Posts:110

02-04-2009 10:48:35 Alert 
MIN of MAX over de LocationID gooien, hij moet toch alleen die ophalen die vaker dan 1x voorkomt...
Peter ter BraakeUser is Offline

Posts:4

02-04-2009 14:15:41 Alert 
Min if Max voorzetten, wat Arjan zegt, kan maar is wat mij betreft niet zo fraai. Mooier is de LocationID opnemen in de GROUP BY. Theorie: elke kolom in de selectlijst moet of van een aggregate functie zijn voorzien of moet voorkomen in de GROUP BY.

Echter, in jouw geval lijken beide oplosssingen mij niet correct. In de query die je aangeeft krijg je nog maar 1 record per Client. Het is dan logisch niet zinvol te vragen om de location omdat er meerdere locations kunnen zijn en die vraag dus een lager detailniveau vereist. Als ik je goed begrijp wil je per client, per lokatie een record met het persentage als kolom erbij. Het percentage moet je dan middels een subquery uitrekenen.
Stephan BussingUser is Offline

Posts:67

02-04-2009 19:18:14 Alert 
De spijker op zijn kop. Nu je het zo uitschrijft is dat wat ik wil en dat kan ik niet bereiken met mijn opzet idd.

Wat moet ik hebben:

In client kan op meerdere locaties zijn ingeschreven. Als dat zo is, dan gaat de client meetellen voor het aantal lokaties waar hij is ingeschreven (in percentage dan). Dus een client zit op twee locaties en telt dan voor beide locaties voor 50% mee.

Uiteindelijk moet ik voor elke locatie tonen hoeveel actieve plannen de clienten van die locatie hebben. Dus als een client alleen op die locatie zit dan telt hij/zij voor 100% (geen probleem). Er kunnen echter ook clienten zijn die dus op meerdere locaties voorkomen. In het bovengenoemde voorbeeld zouden er ook clienten kunnen zijn dus dus voor 50% meetellen.

Ik heb al een query die de 100% gevallen geeft. Daar moet ik de de clienten met een x% bij op gaan tellen. Dat is uiteindelijk de bedoeling.

Ik kan natuurlijk met een lus door de locaties gaan loopen en dan voor elke client van die locatie nagaan voor hoeveel hij/zij mee gaat tellen, dat kan ik zelfs verfijnen omdat het alleen om clienten gaat die meer dan 1 locatie hebben en die query heb ik dus al. Ik zou dat resultaat in een temp-table kunnen proppen en daar dus steeds voor elke locatie in gaan  kijken. Het gaat ook wel lukken, maar omdat jullie de experts zijn wil ik graag leren of het niet handiger kan.

In ieder geval bedankt voor jullie antwoorden. ik ga gewoon verder en komt er een passend antwoord, dan kan ik dat natuurlijk altijd gebruiken.

gr.
Arjan FraaijUser is Offline

Posts:110

02-04-2009 20:39:13 Alert 
Hoi Peter, niet zo FRAAI.... het is Fraaij hoor :-)


Je hebt natuurlijk wel gelijk dat de Lokatie_ID opnemen in de GROUP BY netter zou zijn. Wat hij wil is natuurlijk afhankelijk van de business vraag en zou een MIN of MAX ook mogen voldoen (Alleen de laatste locatie of de startlocatie??/)

@Stephan, is het dit wat je ongeveer zou willen. Is voor de SQL 2005 Adventureworks DB:
Resultaat is een overzicht van all Ciity = locatie_id & Name = Client_ID met bij horende percentage. voor alle city die meer dan 1 keer voorkomen .Zie klein stukje van het resultaat.
0.50 Birmingham Alabama
0.50 Huntsville Alabama
0.04 Calgary Alberta
0.50 Edmonton Alberta
0.25 Chandler Arizona
0.50 Lemon Grove Arizona
0.20 Phoenix Arizona
0.50 Scottsdale Arizona
0.50 Tucson Arizona
0.01 Erlangen Bayern
0.03 Frankfurt Bayern
0.03 Grevenbroich Bayern
0.01 Hof Bayern
0.01 Ingolstadt Bayern


USE AdventureWorks
SELECT
((100/Count(PA.City))*0.01)
, PA.City
, PSP.Name
FROM
Person.Address PA
LEFT OUTER JOIN
Person.StateProvince PSP
ON
PSP.StateProvinceID = PA.StateProvinceID
GROUP BY
PSP.Name
, PA.City
HAVING COUNT(City) > 1
André KammanUser is Offline
PASS Nederland

Posts:137


03-04-2009 00:33:46 Alert 

Hoi Stephan,

Ik heb een alternatief datamodel in elkaar gezet om het voorbeeld dat ik je wil meegeven makkelijker te maken.
Je zult dit dus nog in je hoofd moeten vertalen naar je eigen model...
(Ik hou bijvoorbeeld geen enkele rekening met datakwaliteit, zit er niemand in die inwonend is maar toch ook nog ergens anders wordt behandeld bijvoorbeeld....)

Je hebt het over een percentage maar je lijkt te zoeken naar een soort bezettingsgraad uitgedrukt in een soort FTE's (maar dan clienten ipv personeelsleden)
Ik kan in ieder geval niet ontdekken waarvan dit een percentage zou moeten zijn.
(van het totaal aantal patienten met een geldig behandelplan ?  Die waarde is er makkelijk bij te halen met nog een select in een join, en dan heb je die berekening zo omgetoverd naar een percentage...)

Punt dat ik wil maken is dat je met behulp van een select statement in een join aggregaten kunt maken die op een ander nivo liggen dan in je hoofd query.
En in je hoofdquery kun je vervolgens verder rekenen met die tussenresultaten, je hoofdquery weet helemaal niet dat het aggregaten zijn en zal ook niet vragen om een group by of zo....

Let op de "Use Tempdb" bovenaan, scripts draaien is altijd op eigen risico !

Groeten,

André

SET NOCOUNT ON
USE
tempdb
GO

CREATE
TABLE Client(ClientID INT, Naam NVARCHAR(50))
CREATE TABLE Lokatie(LokatieID INT, Naam NVARCHAR(50), isWonenAfdeling INT)
CREATE TABLE BehandelPlan(ClientID INT, isActief INT)
CREATE TABLE Client_Lokatie(ClientID INT, LokatieID INT)

INSERT
INTO client VALUES(1, 'Jan')
INSERT INTO client VALUES(2, 'Piet')
INSERT INTO client VALUES(3, 'Gerrit')
INSERT INTO client VALUES(4, 'Klaas')
INSERT INTO client VALUES(5, 'Henk')

INSERT INTO Lokatie VALUES(1, 'Lokatie 1', 1)
INSERT INTO Lokatie VALUES(2, 'Lokatie 2', 0)
INSERT INTO lokatie VALUES(3, 'Lokatie 3', 0)

INSERT INTO BehandelPlan VALUES(1, 1)
INSERT INTO BehandelPlan VALUES(2, 1)
INSERT INTO BehandelPlan VALUES(3, 1)
INSERT INTO BehandelPlan VALUES(4, 1)
INSERT INTO BehandelPlan VALUES(5, 1)

INSERT INTO Client_Lokatie VALUES(1, 1)
INSERT INTO client_lokatie VALUES(2, 2)
INSERT INTO client_lokatie VALUES(3, 2)
INSERT INTO client_lokatie VALUES(3, 3)
INSERT INTO client_lokatie VALUES(4, 3)
INSERT INTO client_lokatie VALUES(5, 3)

SELECT
   l.Naam Lokatie,
   SUM(100 / (ISNULL(wlf.WonenLokatieFactor, 0) + ISNULL(lf.LokatieFactor, 0)) * 0.01) Bezetting
FROM Client_Lokatie cl
JOIN Client c ON c.ClientID = cl.ClientID
JOIN BehandelPlan bp ON bp.ClientID = c.ClientID
JOIN Lokatie l ON l.LokatieID = cl.LokatieID
LEFT JOIN
(
   SELECT COUNT(*) LokatieFactor, c.ClientID
   FROM Client_Lokatie cl
   JOIN Client c ON c.ClientID = cl.ClientID
   JOIN BehandelPlan bp ON bp.ClientID = c.ClientID
   JOIN Lokatie l ON l.LokatieID = cl.LokatieID
   WHERE bp.isActief = 1
   AND l.isWonenAfdeling = 0
   GROUP BY c.ClientID
) lf ON lf.ClientID = c.ClientID
LEFT JOIN
(
   SELECT COUNT(*) WonenLokatieFactor, c.ClientID
   FROM Client_Lokatie cl
   JOIN Client c ON c.ClientID = cl.ClientID
   JOIN BehandelPlan bp ON bp.ClientID = c.ClientID
   JOIN Lokatie l ON l.LokatieID = cl.LokatieID   
   WHERE bp.isActief = 1
   AND l.isWonenAfdeling = 1
   GROUP BY c.ClientID
) wlf ON wlf.ClientID = c.ClientID
WHERE bp.isActief = 1
GROUP BY l.Naam

DROP
TABLE Client
DROP TABLE Lokatie
DROP TABLE BehandelPlan
DROP TABLE Client_Lokatie

Lokatie        Bezetting
Lokatie 1     1.00
Lokatie 2     1.50
Lokatie 3     2.50

 

 

 

Stephan BussingUser is Offline

Posts:67

03-04-2009 13:06:47 Alert 
Ik ga jullie suggesties proberen. Zoals ik al zei, ben ik al begonnen, maar ik zie aan jullie code dat het veel makkelijker kan. Wel moet ik even goed lezen en begrijpen wat jullie schrijven, maar mijn eerste indruk is idd dat wat ik wil.

Bedankt voor jullie moeite. Ik zal laten weten wat het wordt.

Gr.
Stephan BussingUser is Offline

Posts:67

03-04-2009 14:02:39 Alert 
@Arjan

Ik heb ook zo'n zelfde resutlaat. Dat is wel gelukt. De uitdaging zit erin dat ik nu voor elke afdeling moet controleren welke clienten 100% mee mogen tellen. (Dat is als de client maar op 1 afdeling zit) en welke clienten maar voor een deel mee mogen tellen. En daarvoor wilde ik per client weten (alleen dus voor de clienten die op meerdere afdelingen voorkomen) voor welke percentage hij mee mag tellen.

Daarom zou ik het resultaat bv in een temptable kunnen stoppen. En vervolgens per afdeling gaan kijken welke clienten er dus voor 100% meetellen en daarbij op te tellen voor het deel van een client die op meerdere afdelingen zit (en een actief plan heeft).

@Andre

Precies dit stuk: "Ik hou bijvoorbeeld geen enkele rekening met datakwaliteit, zit er niemand in die inwonend is maar toch ook nog ergens anders wordt behandeld bijvoorbeeld....", daar gaat het juist om.

Misschien is een voorbeeld beter.

Client X zit op Afdeling A en heeft een actief plan
Client Y zit op Afdeling A en B en heeft een actief plan

In mijn overzicht zou het er dus als volgt uitzien

Afdeling A:
2 clienten
Percentage actieve plannen is: 75% (1.5 clienten / 2 plannen = 0.75) Client X telt nl. 1 keer mee en client Y voor 0.5 omdat hij op twee afdelingen zit)
Afdeling B:
1 client
Percentage actieve plannen is: 50% (0.5 clienten/1 plannen = 0.50)

Als ik het zo eerder had uitgelegd, was het duidelijker geweest.
André KammanUser is Offline
PASS Nederland

Posts:137


03-04-2009 14:22:42 Alert 

Zoiets ?

SELECT
   l.Naam Lokatie,
   SUM(100 / (ISNULL(wlf.WonenLokatieFactor, 0) + ISNULL(lf.LokatieFactor, 0)) * 0.01) Clienten,
   COUNT(*) Plannen,
   (SUM(100 / (ISNULL(wlf.WonenLokatieFactor, 0) + ISNULL(lf.LokatieFactor, 0)) * 0.01) / COUNT(*)) * 100 Percentage

(Gewoon de select met de kolommen vervangen bij het vorige voorbeeld)

Mijn opmerking over datakwaliteit had betrekking over foute data in de database, niet over de geschetste situatie...

Stephan BussingUser is Offline

Posts:67

03-04-2009 21:22:04 Alert 
Ah, nou Andre, ik heb nog niet eens tijd gehad om je vorige voorbeeld echt even te proberen.

Maar ik ben iig enorm geholpen. Jullie horen/zien het resultaat wel.

Bedankt voor de gedane moeite. Ik denk soms iets te omslachtig zie ik al.


Stephan BussingUser is Offline

Posts:67

03-04-2009 23:07:45 Alert 
Andre, het is bijna gelukt er zit echter nog 1 ding in waarvan ik niet weet of het wel in deze ene query is op te lossen. Als een client op twee afdelingen zit waarvan 1 een woonafdeling, dan moet hij daar voor 100% meetellen. Dat heb ik nu wel voor elkaar (of het goed is, weet ik niet, kan jij dit beoordelen). Dat betekent dat hij bij de overige afdelingen niet meer meetelt in de sterkte. En dat lukt nog niet. Ik krijg nl. in mijn voorbeeld dat er 3 plannen voor afdeling 2 zijn en dat de bezetting 2.5 zou zijn, maar omdat client 6 al bij de woonafdeling voor 100% wordt geteld, moet zijn plan hier niet meetellen en de bezetting zou 2 moeten zijn (dat is natuurlijk niet helemaal correct, werkelijk zou het idd 2,5 zijn, maar dan klopt de berekening niet meer.

Dus
- client op wonen 100% meetellen
- Client niet op wonen dan meetellen naar ratio.

ik heb nu:

CREATE TABLE Client(ClientID INT, Naam NVARCHAR(50))
CREATE TABLE Lokatie(LokatieID INT, Naam NVARCHAR(50), isWonenAfdeling INT)
CREATE TABLE BehandelPlan(ClientID INT, isActief INT)
CREATE TABLE Client_Lokatie(ClientID INT, LokatieID INT)

INSERT INTO client VALUES(1, 'Jan')
INSERT INTO client VALUES(2, 'Piet')
INSERT INTO client VALUES(3, 'Gerrit')
INSERT INTO client VALUES(4, 'Klaas')
INSERT INTO client VALUES(5, 'Henk')
INSERT INTO client VALUES(6, 'Geert')

INSERT INTO Lokatie VALUES(1, 'Lokatie 1', 1)
INSERT INTO Lokatie VALUES(2, 'Lokatie 2', 0)
INSERT INTO lokatie VALUES(3, 'Lokatie 3', 0)

INSERT INTO BehandelPlan VALUES(1, 1)
INSERT INTO BehandelPlan VALUES(2, 1)
INSERT INTO BehandelPlan VALUES(3, 1)
INSERT INTO BehandelPlan VALUES(4, 1)
INSERT INTO BehandelPlan VALUES(5, 1)
INSERT INTO BehandelPlan VALUES(6, 1)

INSERT INTO Client_Lokatie VALUES(1, 1)
INSERT INTO client_lokatie VALUES(2, 2)
INSERT INTO client_lokatie VALUES(3, 2)
INSERT INTO client_lokatie VALUES(3, 3)
INSERT INTO client_lokatie VALUES(4, 3)
INSERT INTO client_lokatie VALUES(5, 3)
INSERT INTO client_lokatie VALUES(6, 1)
INSERT INTO client_lokatie VALUES(6, 2)

SELECT
   l.Naam Lokatie,
    SUM(100 / (ISNULL(wlf.WonenLokatieFactor, 0) + ISNULL(lf.LokatieFactor, 0)) * 0.01) Bezetting,
    SUM(100 / (ISNULL(wlf.WonenLokatieFactor, 0) + ISNULL(lf.LokatieFactor, 0)) * 0.01) Clienten,
    COUNT(*) Plannen,
   (SUM(100 / (ISNULL(wlf.WonenLokatieFactor, 0) + ISNULL(lf.LokatieFactor, 0)) * 0.01) / COUNT(*)) * 100 Percentage
FROM Client_Lokatie cl
JOIN Client c ON c.ClientID = cl.ClientID
JOIN BehandelPlan bp ON bp.ClientID = c.ClientID
JOIN Lokatie l ON l.LokatieID = cl.LokatieID
LEFT JOIN
(
   SELECT COUNT(*) LokatieFactor, c.ClientID
   FROM Client_Lokatie cl
   JOIN Client c ON c.ClientID = cl.ClientID
   JOIN BehandelPlan bp ON bp.ClientID = c.ClientID
   JOIN Lokatie l ON l.LokatieID = cl.LokatieID
   WHERE bp.isActief = 1
   AND l.isWonenAfdeling = 0
    AND c.ClientID NOT IN (SELECT c.ClientID
                FROM Client_Lokatie cl
                JOIN Client c ON c.ClientID = cl.ClientID
                JOIN Lokatie l ON l.LokatieID = cl.LokatieID  
                AND l.isWonenAfdeling = 1
                GROUP BY c.ClientID)
   GROUP BY c.ClientID
) lf ON lf.ClientID = c.ClientID
LEFT JOIN
(
   SELECT COUNT(*) WonenLokatieFactor, c.ClientID
   FROM Client_Lokatie cl
   JOIN Client c ON c.ClientID = cl.ClientID
   JOIN BehandelPlan bp ON bp.ClientID = c.ClientID
   JOIN Lokatie l ON l.LokatieID = cl.LokatieID  
   WHERE bp.isActief = 1
   AND l.isWonenAfdeling = 1
   GROUP BY c.ClientID
) wlf ON wlf.ClientID = c.ClientID
WHERE bp.isActief = 1
GROUP BY l.Naam

DROP TABLE Client
DROP TABLE Lokatie
DROP TABLE BehandelPlan
DROP TABLE Client_Lokatie

Voor de afdelingen 1 en 3 klopt het nu, alleen voor twee niet, dat komt omdat client 6 met zijn plan hier nog meegeteld wordt. Moet ik de query misschien splitsen. Eentje voor alleen wonen en een  voor de rest.

Thx



Stephan BussingUser is Offline

Posts:67

03-04-2009 23:23:07 Alert 
En als ik de query uitbreid zodat ik alleen voor de niet woonafdelingen het resultaat opvraag, dan lijkt het goed, dus als ik er twee querys van maak, eentje voor de woonafdelingen en een voor de niet woonafdelingen (zoals hieronder) dan lijkt het goed te gaan, wat is jouw idee hierover?

SELECT
   l.Naam Lokatie,
    SUM(100 / (ISNULL(wlf.WonenLokatieFactor, 0) + ISNULL(lf.LokatieFactor, 0)) * 0.01) Bezetting,
    SUM(100 / (ISNULL(wlf.WonenLokatieFactor, 0) + ISNULL(lf.LokatieFactor, 0)) * 0.01) Clienten,
    COUNT(*) Plannen,
   (SUM(100 / (ISNULL(wlf.WonenLokatieFactor, 0) + ISNULL(lf.LokatieFactor, 0)) * 0.01) / COUNT(*)) * 100 Percentage
FROM Client_Lokatie cl
JOIN Client c ON c.ClientID = cl.ClientID
JOIN BehandelPlan bp ON bp.ClientID = c.ClientID
JOIN Lokatie l ON l.LokatieID = cl.LokatieID
LEFT JOIN
(
   SELECT COUNT(*) LokatieFactor, c.ClientID
   FROM Client_Lokatie cl
   JOIN Client c ON c.ClientID = cl.ClientID
   JOIN BehandelPlan bp ON bp.ClientID = c.ClientID
   JOIN Lokatie l ON l.LokatieID = cl.LokatieID
   WHERE bp.isActief = 1
   AND l.isWonenAfdeling = 0
    AND c.ClientID NOT IN (SELECT c.ClientID
                FROM Client_Lokatie cl
                JOIN Client c ON c.ClientID = cl.ClientID
                JOIN Lokatie l ON l.LokatieID = cl.LokatieID  
                AND l.isWonenAfdeling = 1
                GROUP BY c.ClientID)
   GROUP BY c.ClientID
) lf ON lf.ClientID = c.ClientID
LEFT JOIN
(
   SELECT COUNT(*) WonenLokatieFactor, c.ClientID
   FROM Client_Lokatie cl
   JOIN Client c ON c.ClientID = cl.ClientID
   JOIN BehandelPlan bp ON bp.ClientID = c.ClientID
   JOIN Lokatie l ON l.LokatieID = cl.LokatieID  
   WHERE bp.isActief = 1
   AND l.isWonenAfdeling = 1
   GROUP BY c.ClientID
) wlf ON wlf.ClientID = c.ClientID
WHERE bp.isActief = 1
AND l.isWonenAfdeling = 0
AND c.ClientID NOT IN (SELECT c.ClientID
                FROM Client_Lokatie cl
                JOIN Client c ON c.ClientID = cl.ClientID
                JOIN Lokatie l ON l.LokatieID = cl.LokatieID  
                AND l.isWonenAfdeling = 1
                GROUP BY c.ClientID)
GROUP BY l.Naam
Stephan BussingUser is Offline

Posts:67

04-04-2009 11:51:59 Alert 
Volgens mij heb ik nu de goede resultaten. Toch twee querys. Eentje voor alleen wonen en een overige:

Het resultaat:

Voor wonen:
*Clienten op een woonlocatie*/
SELECT
l.Naam Lokatie,
COUNT(*) As Bezetting,
COUNT(*) As [Client bijdrage],
SUM(wlf.Plannen) AS Plannen,
SUM(wlf.Plannen* 100)/count(*) AS [% IBPs]
FROM Client_Lokatie cl
JOIN Client c ON c.ClientID = cl.ClientID
JOIN Lokatie l ON l.LokatieID = cl.LokatieID
LEFT JOIN
(
SELECT COUNT(*) Plannen, c.ClientID
FROM Client_Lokatie cl
JOIN Client c ON c.ClientID = cl.ClientID
JOIN Lokatie l ON l.LokatieID = cl.LokatieID
JOIN BehandelPlan bp ON bp.ClientID = c.ClientID
WHERE bp.isActief=1 AND l.isWonenAfdeling = 1
GROUP BY c.ClientID
) wlf ON wlf.ClientID = c.ClientID
WHERE l.isWonenAfdeling = 1
GROUP BY l.Naam


Voor niet wonen:

/*-----------------------------------------
Kolommen:
- Lokatie: De lokatie
- Bezetting: Geeft het aantal clienten op deze lokatie (met en zonder behandelplan
- Client bijdrage: geeft aan voor hoeveel een client mee telt bij het berekenen van het percentage

Uitleg: Als een client op meer dan 1 afdeling zit, dan wordt hij meegeteld naar ratio. Dus op 2 afdelingen
dan voor elke afdeling voor 50% meetellen

- % Complete IBP's: Geeft aan van de clienten met een IBP wat de totale score is. Zijn er twee clienten (
van bijvoorbeeld in het totaal van 4 clienten), maar telt er een client voor maar de helft mee, dan zijn er dus
twee plannen en wordt 1.50 gedeeld door 2 geeft 75%

-% Tov de bezetting IBP's: Geeft het percentage IBP's tov de totale bezetting. Als er dus 4 clienten zijn op
een afdeling, waarvan er maar twee een IBP hebben en waarvan 1 van deze twee voor maar 50% meetelt, dan wordt
in dit geval 1.50 / 4 = 37.5%

De procedure houdt clienten die al op een woonafdeling zitten buiten deze berekening.
*/

use IBP
SELECT
l.Naam Lokatie,
COUNT(*) Bezetting,
SUM(ISNULL(lf.Bijdrage, 0)) [Client bijdrage],
SUM(ISNULL(lf.[Plan],0)) As Plannen,
(SUM(ISNULL(lf.Bijdrage, 0)) / SUM(ISNULL(lf.[Plan],0)) * 100) As [% Complete IBPs],
(SUM(ISNULL(lf.Bijdrage, 0)) / count(*) * 100) As [% Tov de bezetting IBPs]
FROM Client_Lokatie cl
JOIN Client c ON c.ClientID = cl.ClientID
JOIN Lokatie l ON l.LokatieID = cl.LokatieID
LEFT JOIN
(
SELECT 1 [Plan] ,(100/Count(*))*0.01 Bijdrage, c.ClientID
FROM Client_Lokatie cl
JOIN Client c ON c.ClientID = cl.ClientID
JOIN BehandelPlan bp ON bp.ClientID = c.ClientID
JOIN Lokatie l ON l.LokatieID = cl.LokatieID
WHERE bp.isActief = 1
AND l.isWonenAfdeling = 0
AND c.ClientID NOT IN (SELECT c.ClientID
FROM Client_Lokatie cl
JOIN Client c ON c.ClientID = cl.ClientID
JOIN Lokatie l ON l.LokatieID = cl.LokatieID
AND l.isWonenAfdeling = 1
GROUP BY c.ClientID)
GROUP BY c.ClientID
) lf ON lf.ClientID = c.ClientID
WHERE l.isWonenAfdeling = 0
AND c.ClientID NOT IN (SELECT c.ClientID
FROM Client_Lokatie cl
JOIN Client c ON c.ClientID = cl.ClientID
JOIN Lokatie l ON l.LokatieID = cl.LokatieID
AND l.isWonenAfdeling = 1
GROUP BY c.ClientID)
GROUP BY l.Naam

Mooi man. Als er nog commentaar op is hoor ik het graag. Altijd leuk iets te leren. Bedant iig

André KammanUser is Offline
PASS Nederland

Posts:137


05-04-2009 22:02:56 Alert 
Hoi Stephan,

Ik zie niet waarom je dit in 2 queries zou moeten stoppen.
Je had 1 query met 2 joins die inwonend en niet inwonend voor je uitrekenen.
Nu wil je voor de niet inwonend query de mensen uitsluiten die al ergens inwonend zijn, dat kan toch net zo makkelijk in de query waar je al een poosje mee bezig bent ?
(Het enige verschil is de "not in" toch ? )

Groeten,

André
Stephan BussingUser is Offline

Posts:67

06-04-2009 19:37:15 Alert 
Hallo André, ik begrijp het niet. Ik neem aan dat je doelt op de query die jij in eerste instantie hebt gemaakt? Ik heb die aangepast omdat ik niet zou weten hoe ik de combinatie zou moeten doen. Inderdaad het alleen maar een NOT IN omdat deze clienten niet mee mogen tellen in de sterkte (bezetting) van de niet wonen afdelingen.

Ik heb de beide query's in een view gezet met een join en dat laat een perfect overzicht zien. Zoals je kunt zien heb ik het wel in een query geprobeerd, maar daar krijg ik niet het juiste resultaat. zie mijn voorgaande post.

Gr.
André KammanUser is Offline
PASS Nederland

Posts:137


07-04-2009 16:54:32 Alert 
Hoi Stephan,

Beide queries in een view met een join geeft precies hetzelfde effect.
Je hoeft dus niet perse mijn schrijfwijze te gebruiken, vergeet niet dat jij 'm moet onderhouden !

Groeten,

André
Stephan BussingUser is Offline

Posts:67

07-04-2009 22:44:38 Alert 
Hallo André, ik bedoelde natuurlijk in een view met een union ipv join. Maar goed, je hebt gelijk, ik moet het onderhouden, maar ik wil altijd wel iets leren. Ik heb ondertussen alweer gebruik kunnen maken van de kennis die ik hier heb opgedaan. Dus hartelijk dank voor je hulp.

Gr.
You are not authorized to post a reply.
Forums > Forums > Ontwikkelen > Hoe moet ik de query opzetten?



ActiveForums 3.6
  
Copyright (c) 2012 PASS Nederland   Privacy Statement  Terms Of Use