Considera la seguente query T-SQL. Sto usando CASE
nel SELECT
e GROUP BY
per combinare i record di due persone in una perché è davvero la stessa persona. Ho cambiato i nomi in "PersonX" per questo esempio.
SELECT
COUNT(DISTINCT d.PONum) AS POCount,
ISNULL(SUM(d.DocExtCost), 0) AS POValue,
CASE v.Buyer_c
WHEN "Person5"
THEN "Person4"
ELSE v.Buyer_c
END AS BuyerID
FROM
[Dbo].PODetail AS d
INNER JOIN
[Dbo].Vendor AS v ON (d.Company = v.Company AND d.VendorNum = v.VendorNum)
WHERE
v.Buyer_c IN ("Person1", "Person2", "Person3", "Person4", "Person5")
GROUP BY
CASE v.Buyer_c
WHEN "Person5"
THEN "Person4"
ELSE v.Buyer_c
END
ORDER BY
v.Buyer_c <-- This order by doesn"t work
Risultati senza l'ordine per:
Quando provo a utilizzare l'ordine per ottengo questo errore:
La colonna "Dbo.Vendor.Buyer_c" non è valida nella clausola ORDER BY perché non è contenuta né in una funzione aggregata né nella clausola GROUP BY.
Non so dove aggiungere il v.Buyer_c
, è già nel GROUP BY
clausola nel CASE
dichiarazione. Se lo aggiungo di nuovo da solo in questo modo:
GROUP BY
CASE v.Buyer_c
WHEN "Person5"
THEN "Person4"
ELSE v.Buyer_c
END,
v.Buyer_c
interrompe il raggruppamento corretto e fornisce due record diversi per Person4 e Person5.
Voglio utilizzare l'ordine in modo da poter ordinare i record in ordine alfabetico. Come posso ordinare i record in ordine alfabetico con ID acquirente?
risposte:
2 per risposta № 1metti order by BuyerID
e controllare
2 per risposta № 2
Devi usare la stessa logica ordinata per
SELECT COUNT(DISTINCT d.PONum) AS POCount,
ISNULL(SUM(d.DocExtCost), 0) AS POValue,
CASE v.Buyer_c
WHEN "Person5" THEN "Person4"
ELSE v.Buyer_c
END AS BuyerID
FROM [Dbo].PODetail AS d
INNER JOIN [Dbo].Vendor AS v
ON (d.Company = v.Company AND
d.VendorNum = v.VendorNum)
WHERE v.Buyer_c IN ("Person1", "Person2", "Person3", "Person4", "Person5")
GROUP BY CASE v.Buyer_c
WHEN "Person5" THEN "Person4"
ELSE v.Buyer_c
END
ORDER BY CASE v.Buyer_c
WHEN "Person5" THEN "Person4"
ELSE v.Buyer_c
END
1 per risposta № 3
Questo sarebbe un modo per farlo:
with cte as
(
select count(distinct d.ponum) as pocount,
isnull(sum(d.docextcost), 0) as povalue,
case v.buyer_c
when "person5" then "person4"
else v.buyer_c
end as buyerid
from [dbo].podetail as d
inner join [dbo].vendor as v on (d.company = v.company and d.vendornum = v.vendornum)
where v.buyer_c in ("person1", "person2", "person3", "person4", "person5")
group by case v.buyer_c
when "person5" then "person4"
else v.buyer_c
end
)
select *
from cte
order by buyerid