Comment puis-je retourner deux colonnes qui utilisent chacune différente où Critia? Évidemment, cela ne fonctionnera pas:
Name | Total | YTD ------------------- Item1 | 2 | 3 Item2 | 4 | 8
7 Réponses :
Vous pouvez probablement utiliser la déclaration MySQL si la déclaration du compte p>
Si vous spécifiez un nom de colonne pour la fonction code> code>, il ne compte pas Ainsi, le moyen simple serait d'utiliser des relevés de cas Pour convertir les valeurs, vous ne voulez pas compter sur Je ne suis pas à 100% certain que le moteur de requête vous permettra d'utiliser un cas dans Comptez (je ne suis même pas sûr de la plate-forme DB que vous utilisez), mais cela vous donne l'idée. Si cette façon ne fonctionne pas, vous pouvez écrire la requête en utilisant une table dérivée qui vous donnera le même résultat. P> P> null code> valeurs. null code> p>
Oups, je n'ai pas remarqué que votre "total" est le nombre de mois à date. Je teste pour voir si l'affaire fonctionne avec le compte sur SQL Server. Je posterai un extrait plus complet quand j'ai fini.
Si vous ne voulez pas compter sur le comportement NULL, vous pourriez toujours simplement avoir la déclaration de cause retour 1 ou 0 et faire une somme au lieu d'un compte.
@JOHNFX: Oui, cela fonctionne aussi. Selon la définition de la table, j'écris parfois les deux et tester des performances si je sais que je vais traiter avec de grands ensembles.
@Matt: J'ai vérifié que cela fonctionne sur SQL Server 2008. J'ai également mis à jour le code posté pour que ce soit MTD / YTD
@Toby: Fonctionne comme prévu comme prévu. Merci!
Bien sûr, vous voudrez ajouter une clause où après le tableau1. Lorsqu'il est survenu_date> = '2010-01-01' et surint_date <'2011-01-01'. Sinon, vous allez lire beaucoup de lignes que vous n'utilisez pas.
semble être une bonne situation pour un syndicat.
SELECT Name, COUNT(Column1) AS Total, COUNT(Column1) AS YearToDate FROM Table1 WHERE Occurred_Date BETWEEN '2010-06-01' AND '2010-06-30' --Total UNION SELECT Name, COUNT(Column1) AS Total, COUNT(Column1) AS YearToDate FROM Table1 WHERE Occurred_Date BETWEEN '2010-01-01' AND '2010-06-30' --YearToDate
Um non. Cela se traduit par 2 rangées, bien en fait une erreur dans la plupart des DBS. Besoin de groupe par nom ... Après cela, vous aurez deux rangées. Une ligne aura la valeur correcte pour le total et la mauvaise valeur pour l'année à l'autre, l'autre rangée sera l'inverse. N'utilisez également jamais Union lorsque vous savez que vous avez deux ensembles de résultats différents. Union oblige une sorte, l'Union tout n'a pas. Oui, ce n'est que deux rangées ... c'est juste une mauvaise habitude. Utilisez un syndicat tout le temps et supprimez tout le tout lorsque vous avez besoin du travail supplémentaire effectué.
Cela ne vous donne pas deux colonnes, il retourne deux rangées avec la même colonne
Vous pouvez également utiliser
SELECT m.count, ytd.count FROM (SELECT COUNT( id ) count FROM table WHERE date BETWEEN '2010-06-01' AND '2010-06-30') m, (SELECT COUNT( id ) count FROM table WHERE date BETWEEN '2010-01-01' AND '2010-06-30') ytd
SELECT Name
,COUNT(CASE WHEN Occurred_Date BETWEEN '2010-06-01' AND '2010-06-30' THEN Column1 ELSE NULL END) AS Total
,COUNT(CASE WHEN Occurred_Date BETWEEN '2010-01-01' AND '2010-06-30' THEN Column1 ELSE NULL END) AS YearToDate
FROM Table1
WHERE Occurred_Date BETWEEN '2010-06-01' AND '2010-06-30' -- (unnecessary)
OR Occurred_Date BETWEEN '2010-01-01' AND '2010-06-30'
GROUP BY Name
SELECT Name
,SUM(
CASE WHEN Occurred_Date BETWEEN '2010-06-01' AND '2010-06-30'
THEN 1
ELSE 0
END) AS Total
,SUM(
CASE WHEN Occurred_Date BETWEEN '2010-01-01' AND '2010-06-30'
THEN 1
ELSE 0
END) AS YearToDate
FROM Table1
GROUP BY Name
EDIT: This should work in SQL Server.
SELECT DISTINCT m.field1, b.field2,
SUM (CASE
WHEN m.created_on >=
TO_DATE ('15/11/2012', 'DD/MM/YYYY')
AND m.created_on <
TO_DATE ('15/11/2012', 'DD/MM/YYYY')
+ 1
THEN 1
ELSE 0
END
) AS count1,
COUNT (1) AS count2
FROM table1 m, table2 b
WHERE m.field1 IN (SELECT DISTINCT field1
FROM table1)
AND b.field1 = m.field1
GROUP BY m.field1, b.field2
ORDER BY count2 DESC;
Je ne sais pas si cela est possible sans obtenir un conflit dans la série de résultats.