J'ai une table comme celle-ci dans ma base de données: 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. P> de sorte que la sortie doit être comme celle-ci: p> 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. P> p>
3 Réponses :
Si vous ne voulez qu'une ligne par personne / combinaison mensuelle, utilisez l'agrégation. Vous utilisez un ayant code> clause pour filtrer le 'Content' ' code> lignes:
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 ... code>. Pouvez-vous expliquer ce qui doit être changé?
@Robin. . . Cela pourrait être parce que mois code> 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' code>
@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 code> et exécutez la procédure que j'ai mentionnée dans un commentaire antérieur.
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
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')