/ / SQL Server: dopo aver utilizzato GROUP BY con CASE, ORDER BY non funziona - sql-server, tsql

SQL Server: dopo aver utilizzato GROUP BY con CASE, ORDER BY non funziona - sql-server, tsql

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:

inserisci la descrizione dell'immagine qui

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 № 1

metti 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