Reputation: 3
That was a really badly worded question, but basically when i'm doing:
SELECT
SUM(CASE WHEN number = streetNumber AND lname = streetName
THEN 1 ELSE 0 END) AS coincidence,
COUNT(streetNumber) Amount,
Amount-concidence diff
FROM records
WHERE coincidence < Amount;
But obviously I cant do AMOUNT-COINCIDENCE, so how can I fix this without duplicating the code and having to do this instead:
SELECT
SUM(CASE WHEN number = streetNumber AND lname = streetName
THEN 1 ELSE 0 END) AS coincidence,
COUNT(streetNumber) Amount,
COUNT(streetNumber) -
SUM(CASE WHEN number = streetNumber AND lname = streetName
THEN 1 ELSE 0 END) diff
FROM records
WHERE SUM(CASE WHEN number = streetNumber AND lname = streetName
THEN 1 ELSE 0 END) < COUNT(streetNumber)
This code has been made for the purpose of this question!
Upvotes: 0
Views: 70
Reputation: 1028
if this same value is used in many places, you should create a view with a column or create a computed column in the table (I prefer the view method)
CASE WHEN number = streetNumber AND lname = streetName
THEN 1 ELSE 0 END
or if you just use this calculation in that place.. should use a common table expression instead the view
with my_cte as (
SELECT
CASE WHEN number = streetNumber AND lname = streetName
THEN 1 ELSE 0 END AS coincidence,
streetNumber
FROM records
)
SELECT
SUM(coincidence) AS coincidence,
COUNT(streetNumber) Amount,
COUNT(streetNumber) -
SUM(coincidence) diff
FROM my_cte
having SUM(coincidence) < COUNT(streetNumber)
or if you don't like cte, still can you use an outer apply
SELECT
SUM(V.Coincidence) AS coincidence,
COUNT(streetNumber) Amount,
COUNT(streetNumber) -
SUM(V.Coincidence) diff
FROM records
OUTER APPLY (SELECT CASE WHEN number = streetNumber AND lname = streetName
THEN 1 ELSE 0 END AS Coincidence) V
HAVING SUM(V.Coincidence) < COUNT(streetNumber)
Upvotes: 0
Reputation: 48770
Use a "table expression" to precompute the values, and then you can use a simpler query.
select
coincidence,
amount,
amount - coincidence as diff
from ( -- here's the table expression
select
sum(case when number = streetnumber and lname = streetname
then 1 else 0 end) as coincidence,
count(streetnumber) as amount,
from records
) x
where coincidence < amount
Alternatively, some people find CTEs (Common Table Expression) more readable:
with
x as ( -- here's the CTE
select
sum(case when number = streetnumber and lname = streetname
then 1 else 0 end) as coincidence,
count(streetnumber) as amount,
from records
)
select
coincidence,
amount,
amount - coincidence as diff
from x
where coincidence < amount
Upvotes: 1
Reputation: 1269443
I think a subquery is the simplest method:
SELECT r.*, Amount - concidence as diff
FROM (SELECT SUM(CASE WHEN number = streetNumber AND lname = streetName
THEN 1 ELSE 0
END) AS coincidence,
COUNT(streetNumber) as Amount,
FROM records r
) r
WHERE coincidence < Amount;
Upvotes: 3