2009-10-14 6 views
0

Je souhaite effectuer une requête Seuil, par laquelle on prendrait la valeur d'un champ d'aujourd'hui et la comparerai à la valeur d'hier, cette requête ressemblerait à ceci, mais évidemment, elle est faux, et je ne peux pas trouver comment le faire:Aide avec une requête SQL

select 
    TableB.Name, 
    TableA.Charge, 
    ( 
    select Charge 
    from TableA 
    where (DateAdded >= '13/10/2009' and DateAdded < '14/10/2009') 
    ) 
    from TableA 

inner join 
    TableB on TableB.ID = TableA.ID 

where 
    TableA.DateAdded >= '10/14/2009' 

order by 
    Name asc 

Juste un petit mot, je suis à la recherche de deux CHARGE champs, pas les dates. La manipulation de la date est simplement pour Aujourd'hui et Hier, rien de plus. A la fin de ceci, je veux faire un calcul sur les deux champs de charge retournés, donc si c'est plus facile à montrer cela, ce serait aussi génial.

Merci à l'avance

Kyle

EDIT1:

Les données que je cherche est comme ceci:

Hier, nous saisissons une charge de 500 à MachineA nous saisissons aujourd'hui une charge de 300 à MachineA

Nous courons la requête, et les résultats dont j'ai besoin sont les suivants:

Name = MachineA 
Charge = 300 
YesterdayCharge = 500 

Répondre

0

Si vous avez vraiment besoin date précédente (y compris les week-ends, etc.), puis la requête suivante devrait faire le travail. Sinon, s'il vous plaît envoyer des échantillons de données et les résultats attendus:

SELECT  TableB.Name, 
      TableA.Charge, 
      prev.Charge AS PrevCharge 
FROM  TableA 
INNER JOIN TableB 
     ON TableA.ID = TableB.ID 
LEFT JOIN TableA prev 
     ON TableA.ID = prev.ID 
     --// use this if DateAdded contains only date 
     --AND TableA.DateAdded = DATEADD(day, +1, prev.dateAdded) 
     --// use this if DateAdded contains also time component 
     AND CONVERT(DATETIME, CONVERT(CHAR(8), TableA.DateAdded, 112), 112) = DATEADD(day, +1, CONVERT(DATETIME, CONVERT(CHAR(8), prev.dateAdded, 112), 112)) 

modifier-1: Ajout d'une option dans JOIN pour les cas où DateAdded contient le temps et

+0

C'est le type de chose que je recherche, mais je reçois la valeur NULL pour le champ PrevCharge. Je vais mettre à jour la question avec un échantillon de données cependant. –

+0

Pouvez-vous publier des exemples de valeurs à partir du champ DateAdded? Je voudrais être sûr si vous avez juste rendez-vous là ou aussi un composant de temps? Parce que si vous avez le temps, il est évidemment très improbable que le précédent soit arrivé exactement au même moment. En outre, êtes-vous sûr de n'avoir qu'une entrée par ID par jour? – van

+0

requête mise à jour avec une autre clause JOIN pour gérer le composant temps – van

0

quelque chose comme ça?

SELECT 
    B.Name, 
    A.Charge, 
    DATEPART(day, A.DateAdded) as day 
FROM 
    TableA A, Table B 
WHERE 
    B.ID = A.ID AND 
    A.DateAdded BETWEEN DATEADD(day, -1, GETDATE()) AND GETDATE() 
GROUP BY 
    B.Name, 
    A.Charge, 
    A.DateAdded 
+0

Je reçois une erreur avec ceci: Toutes les requêtes combinées à l'aide d'un opérateur UNION, INTERSECT ou EXCEPT doivent avoir un nombre égal d'expressions dans leurs listes cibles. –

+0

vous allez vous retrouver avec une seule ligne par jour – balexandre

0

Essayez ceci:

DECLARE @ValuesTable TABLE(Name VARCHAR(20), Charge INT, DateAdded DATETIME) 

INSERT INTO @ValuesTable 
SELECT 'Name1', 10, DATEADD(dd, 2, DATEDIFF(dd, 0, GETDATE())) UNION 
SELECT 'Name2', 20, DATEADD(dd, 2, DATEDIFF(dd, 0, GETDATE())) UNION 
SELECT 'Name1', 30, DATEADD(dd, 1, DATEDIFF(dd, 0, GETDATE())) UNION 
SELECT 'Name2', 40, DATEADD(dd, 1, DATEDIFF(dd, 0, GETDATE())) UNION 
SELECT 'Name1', 50, DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) UNION 
SELECT 'Name2', 60, DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE())) UNION 
SELECT 'Name1', 70, DATEADD(dd, -1, DATEDIFF(dd, 0, GETDATE())) UNION 
SELECT 'Name3', 80, DATEADD(dd, -1, DATEDIFF(dd, 0, GETDATE())) UNION 
SELECT 'Name1', 90, DATEADD(dd, -2, DATEDIFF(dd, 0, GETDATE())) UNION 
SELECT 'Name2', 100, DATEADD(dd, -2, DATEDIFF(dd, 0, GETDATE())) 


SELECT 
ISNULL(T.Name,Y.Name) AS Name, 
SUM(ISNULL(Y.Charge,0)) AS Yesterday, SUM(ISNULL(T.Charge,0)) AS Today, 
SUM(ISNULL(T.Charge,0)) - SUM(ISNULL(Y.Charge,0)) AS Diff 
FROM(
    SELECT Name, Charge 
    FROM @ValuesTable 
    WHERE DateAdded BETWEEN DATEADD(day, -2, GETDATE()) 
     AND DATEADD(day, -1, GETDATE()) 
) AS Y 
FULL JOIN(
    SELECT Name, Charge 
    FROM @ValuesTable 
    WHERE DateAdded BETWEEN DATEADD(day, -1, GETDATE()) AND GETDATE() 
) AS T ON ISNULL(T.Name,Y.Name) = ISNULL(Y.Name,T.Name) 
GROUP BY ISNULL(T.Name,Y.Name) , ISNULL(Y.Name,T.Name) 
0

Il peut être juste une faute de frappe dans SO mais Si vous utilisez des chaînes de date '14/10/2009 'et '10/14/2009' dans la même requête, cela ne fonctionnera jamais. Quel que soit le format de date utilisé, l'un d'entre eux comporte trop de mois.

+0

Oui, était juste une faute de frappe :) –