0
votes

Comment grouper des lignes en SQL avec une condition spéciale?

J'ai une table comme celle-ci dans ma base de données: xxx

Je dois écrire une requête SQL qui sélectionne chaque mois qui ne contient pas de "contenu" au moins une fois. Et il ne devrait donner qu'une seule ligne.

de sorte que la sortie doit être comme celle-ci: xxx

Comment puis-je accomplir avec une requête SQL? J'ai essayé de faire cela avec le groupe par fonction, mais je ne pouvais pas le faire fonctionner correctement.

sql

0 commentaires

3 Réponses :


1
votes

Si vous ne voulez qu'une ligne par personne / combinaison mensuelle, utilisez l'agrégation. Vous utilisez un ayant clause pour filtrer le 'Content' ' lignes: xxx


5 commentaires

Cette requête fonctionne parfaitement avec SQLite. Toutefois, si j'essaie d'utiliser cela dans Excel (données -> "à partir d'autres sources" -> à partir de la requête Microsoft) et exécutez la requête SQL, je reçois une erreur de syntaxe. Le problème semble être lié à la partie commençant par avoir ... . Pouvez-vous expliquer ce qui doit être changé?


@Robin. . . Cela pourrait être parce que mois est un mot réservé ODB.


Merci pour l'indice, mais cela ne fonctionne pas même si je change le colonnier en quelque chose d'autre. C'est une erreur de syntaxe STILL (Opérateur manquant) dans l'expression de requête 'SUM (cas lorsque spécial =' Content 'puis 1 autre 0 extrémité) = 0'


@Robin. . . Le code est valide code SQL Server. Quelle est la base de données sous-jacente?


C'est une base de données SQLite et votre code SQL-Requête fonctionnait parfaitement dans mon navigateur de base de données. Pour la tentative d'exécution du code dans Excel, je viens de copier la table de mon message d'origine dans un fichier .xlsx et exécutez la procédure que j'ai mentionnée dans un commentaire antérieur.



0
votes

Utilisez celui-ci

select *
from t
where month not in ( select month from t as t2 where t2.special = 'content')
group by person_id, month, name, special


0 commentaires

0
votes

Je pense que vous avez juste besoin de

select distinct *
from t t1
where not exists(select 1 from t t2 where t1.month=t2.month and t2.special = 'content')


0 commentaires