J'ai une table comme suit dans laquelle J'ai créé une requête qui me dirait le compte par pays (par exemple 4 records , pour l'Allemagne, 2 pour le Mexique, etc.). P> i get p> Je suppose que les colonnes énumérées dans le Le groupe par clause est utilisé pour former des groupes. Le groupement est basé sur des lignes de même valeur dans la colonne spécifiée ou les colonnes étant placées dans le même groupe. Donc, dans l'exemple ci-dessus, quelque chose comme p> pays code> pourrait être dupliqué. argentina code> groupe contient 3 rangées. Est possible que je puisse avoir accès à des rangées individuelles qui sont dans un groupe afin que je puisse également produire les villes dans le résultat? P>
3 Réponses :
Vous pouvez rejoindre la table groupée à la table d'origine:
select cu.*, co.cnt from Customers cu
join (
select Country, count(Country) cnt AS Count
from Customers
group by Country
) co on cu.Country = co.Country
Désolé, je ne comprends pas comment cela me donnera accès à des villes individuelles d'un groupe
@Manuchadha utilise Cu.City code> pour y accéder.
SELECT country, LISTAGG(city, ', ') WITHIN GROUP (ORDER BY city) as cities, count (*) as count FROM customers GROUP BY country ORDER BY country
Cela imprimera plusieurs fois pays, ville si la ville est différente et que le pays est identique
Oui, si vous utilisez Oracle, vous pouvez utiliser Listagg, pour produire une liste de villes séparées par des virgules pour chaque pays: Sélectionnez Pays, Listagg (Ville, ') Au sein du groupe (commander par ville) comme des villes du groupe des clients par pays d'ordre par pays pays;
thats ce que je dis il n'y a aucune surprise, le SGMS est à nouveau Oracle pour générer SQL généralisé pour tous les SGBD
J'ai mis à jour ma réponse et je crois que cela produit le résultat souhaité maintenant. Si oui, veuillez marquer la réponse comme correcte. Bonne journée.
Merci Ted. J'ai essayé votre réponse, mais pour un total de 91 enregistrements, votre requête n'a montré que 69
Vous pouvez essayer le code ci-dessous.
alter proc dbo.gen_sp_g_concatdatas
COMME
COMMENCER
Déclarez @Countryname comme INT, @rowctry comme int = 1, @Cities comme Varchar (max) = '', @rowcity comme int = 1
DÉCLARE @TMPTABLECONTRY TABLE (ID INT, PAYS VARCHAR (MAX)))
Insérer dans @tmbarCountry
(Id, pays)
Sélectionnez Row_Number () sur (Commande par ISNULL (Pays, 0) ASC), - ID - INT
Isnull (pays, 0) - pays - Varchar (max)
De dbo.tmpcustomertable
Groupe par pays
Tandis que @rowctry <= (sélectionnez max (id) à partir de @tmbablecountry)
COMMENCER
Sélectionnez @CountryName = ISNULL (Pays, '') à partir de @tmbarCountry où id = @rowctry P> fin p> Sélectionnez * à partir de @TMPtableresult
FINIR
Aller p> p>
quel SGBD utilisez-vous? Certaines offrent une fonction d'agrégation group_concat qui fait exactement ce dont vous avez besoin.
Oui. C'est possible. Mais quel est votre SGBDM?
Pratiquer sur
w3schools code> site web. Je ne sais pas queldb code> ils utilisentLe SGBD est votre réponse
Pourquoi la question est-elle marquée?
La table dérivée et la commande par sont totalement inutiles. Votre requête est équivalente à
Sélectionnez Pays, Count (Pays) comme comptage de la commande client par pays code>Vous obtenez probablement des bowvotes parce que vous ne spécifiez pas quel DBMS utilisez-vous. Sans ces informations, le problème ne peut pas être résolu.
Je suppose que le DBMS est SQL Server la plupart des temps que j'ai vus sur les écoles W3