2013-07-21 5 views
0

J'ai une table comme ceci:passant différent id automatiquement sql

Locid  Paydate     DelDate     vtid 

5   2013-05-07 18:36:50.000 2013-05-07 18:58:32.000 7 
5   2013-05-07 18:36:50.000 2013-05-07 18:58:32.000 8 
6   2013-05-07 18:36:50.000 2013-05-07 18:58:32.000 7 
6   2013-05-07 18:36:50.000 2013-05-07 18:58:32.000  8 
7   2013-05-07 18:36:50.000 2013-05-07 18:58:32.000 7 

je une procédure stockée comme ceci:

ALTER PROCEDURE [dbo].[performance] @locid INTEGER=NULL 
AS 
    BEGIN 
     SET NOCOUNT ON; 

     SELECT l.LocName, 
      v.Vtype, 
      SUM(DATEDIFF(MI, t.Paydate, t.DelDate))             AS TotalDiff, 
      CONVERT(DECIMAL(10, 1), AVG(CONVERT(NUMERIC(18, 2), DATEDIFF(MI, t.Paydate, t.DelDate)))) AS Average 
     FROM Transaction_tbl t 
      LEFT JOIN VType_tbl v 
       ON t.vtid = v.vtid 
      LEFT JOIN Location_tbl l 
       ON t.Locid = l.Locid 
     WHERE t.Locid = @locid 
     GROUP BY v.Vtype, 
       l.LocName 
    END 

, dans ce à un moment que je peux en mesure de passer seulement un locid, un certain temps je dois sortir mettre 2 locid dans un ensemble de données. alors comment je peux passer deux locid automatiquement.

+1

Quelle version de SQL Server et que voulez-vous dire "passer deux Locid automatiquement?" Comment peut-il être automatique? –

+0

SQL Server 2008, passer deux locid signifie que je veux passer le locid 5 et 6. – user2603688

+0

C'était le bit "automatique" que je n'étais pas clair. Votre appel à la procédure devra fournir ces valeurs de paramètres d'une manière ou d'une autre. –

Répondre

4

vous pouvez modifier la procédure stockée pour accepter un paramètre d'une valeur de table (qui peut alors accepter un nombre arbitraire de locid s)

CREATE TYPE [dbo].[LocationIds] AS TABLE(
    locid INTEGER PRIMARY KEY) 

Puis

ALTER PROCEDURE [dbo].[performance] 
@LocationIds [dbo].[LocationIds] READONLY 
AS 

Et changer le WHERE à

WHERE t.Locid in (SELECT locid FROM @LocationIds ) 

Ajoutez également l.Locid à la liste GROUP BY sauf si le nom est garanti unique.

+0

actullay ce locid est dynamique value.some locid va venir jusqu'à 10, donc j'ai déclaré 10 locid ?? – user2603688

+0

@ user2603688 - Non. Dans ce cas, utilisez le paramètre table value. –

+0

pouvez-vous en mesure de réécrire cette procédure stockée avec le code approprié – user2603688

1

Pour gérer un nombre indéterminé d'ID, vous pouvez les faire passer en une chaîne séparée par des virgules (varchar), les diviser en une table et ensuite s'y joindre.

Quelque chose comme ça.

ALTER PROCEDURE [dbo].[performance] 
    (@ids VARCHAR(MAX)) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @xml xml = N'<root><r>' + REPLACE(@ids,',','</r><r>') + '</r></root>' 

    SELECT 
     l.LocName, 
     v.Vtype, 
     SUM(DATEDIFF(MI, t.Paydate, t.DelDate)) AS TotalDiff, 
     CONVERT(DECIMAL(10, 1), 
      AVG(CONVERT(NUMERIC(18, 2), 
      DATEDIFF(MI, t.Paydate, t.DelDate)))) AS Average 
    FROM Transaction_tbl t 
    JOIN (
     SELECT t.value('.','INT') id 
     FROM @xml.nodes('//root/r') a(t) 
    ) x ON x.id = t.id 
    LEFT JOIN VType_tbl v 
      ON t.vtid = v.vtid 
    LEFT JOIN Location_tbl l 
      ON t.Locid = l.Locid 
    GROUP BY v.Vtype, l.LocName 
END 
GO 

demo

Questions connexes