10
votes

SQL Deux différents où des conditions pour deux colonnes

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


1 commentaires

Je ne sais pas si cela est possible sans obtenir un conflit dans la série de résultats.


7 Réponses :


0
votes

Vous pouvez probablement utiliser la déclaration MySQL si la déclaration du compte


0 commentaires

17
votes

Si vous spécifiez un nom de colonne pour la fonction , il ne compte pas null valeurs.

Ainsi, le moyen simple serait d'utiliser des relevés de cas Pour convertir les valeurs, vous ne voulez pas compter sur null xxx

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.


6 commentaires

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.



0
votes

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


2 commentaires

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



5
votes

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 


0 commentaires

0
votes
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 

0 commentaires

0
votes
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.

0 commentaires

0
votes
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;

0 commentaires