2016-07-28 11 views
1

Ich habe eine gespeicherte Prozedur in SQL Server 2008 R2 erstellt. Es führt eine Pivot-Tabelle aus. Also, was ich für die nächsten Schritte brauche, sind 3 neue Spalten, die in dieser deklarierten Abfragevariablen erstellt werden würden. In diesen 3 Spalten muss ich eine Berechnung durchführen.Erstellen Sie neue Spalten in einer deklarierten Abfragevariable in SQL Server

Zunächst meine gespeicherten Prozeduren Code: UPDATE Stored Procedure:

BEGIN 
    SET NOCOUNT ON; 

    DECLARE @colNo nvarchar(max) 
    DECLARE @colSum nvarchar(max) 
    DECLARE @query nvarchar(max) 

    SET NOCOUNT ON; 

    WITH vals AS (
     SELECT DISTINCT ds.No 
     FROM QRTestView ds 
    ) 

    SELECT @colNo = COALESCE(@colNo + ', ', '') + QUOTENAME(No) 
      @colSum = COALESCE(@colSum + '+ ', '') + QUOTENAME(No) 
    FROM vals 
    ORDER BY No 

    SET @query = 'SELECT *, [Bonus] + 125 as [Fee], 
        ([Bonus] + 125) * [ALL] as [Fee2] 
        FROM (
         SELECT *, 
         CASE WHEN 70-(100 - Quote) * 10 > -80 THEN 70-(100 - Quote) * 10 ELSE -70 END as [Bonus] 
         FROM (
         SELECT *, '[email protected]+' as [ALL] 
         FROM (
          SELECT 
          CAST(ISIN as CHAR(12)) As No, 
          CAST(Quote as CHAR(7)) As Quote, 
          CAST(Quote as CHAR(7)) As Q 
          FROM QRTestView 
          WHERE Datum >= @from_val and Datum <= @to_val 
         ) AS sel 
         PIVOT (
          COUNT(Q) 
          FOR No IN ('+ @colNo +') 
         ) AS p 

         UNION ALL 

         SELECT ''ALL'', *, '[email protected]+'[ALL] 
         FROM (
         SELECT 
          CAST(No as CHAR(12)) As No, 
          COUNT(CAST(Quote as CHAR(7))) As Quote 
         FROM QRTestView 
         WHERE Datum >= @from_val and Datum <= @to_val 
         GROUP BY CAST(No as CHAR(12)) 
        ) AS sel 
         PIVOT (
         MAX(Quote) 
         FOR No in ('+ @colNo +') 
        ) AS p 
        ) AS sel2 
       ) as ff 

      ORDER BY CASE WHEN Quote = ''ALL'' THEN 101 ELSE CAST(Quote as INT) END DESC' 

    EXEC sp_executesql @query, N'@from_val datetime, @to_val datetime', @from_val = @from, @to_val = @to 
END 

die Frage zu verstehen, werde ich Ihnen die Quelltabelle zeigen:

| No  | Quote | Datum 
| DE10101 | 100 | 2016-01-01 
| DE10121 | 100 | 2016-01-02 
| DE10101 | 100 | 2016-01-05 
| DE22034 | 98 | 2016-01-05 
| DE10101 | 98 | 2016-01-10 
| DE10121 | 80 | 2016-01-10 
| DE22034 | 98 | 2016-01-10 
| DE22034 | 80 | 2016-01-11 
| DE10101 | 100 | 2016-01-20 
| DE10121 | 80 | 2016-01-21 

Und die Zieltabelle hat 3 zusätzliche Spalten:

| Quote | DE10101 | DE10121 | DE22034 | ALL | Bonus | Fee | Fee2 | 
| 100 | 3 | 1 | 0 | 4 | 70 | 195 | 780 | 
| 98 | 1 | 0 | 2 | 3 | 50 | 175 | 525 | 
| 80 | 0 | 2 | 1 | 3 | -70 | 55 | 165 | 
| ALL | 4 | 3 | 3 | 10 |  |  | 1470 | 

die 3 neuen Spalten sind: Bonus, Fee, Fee2

Die Berechnung wie folgt funktioniert:

Bonus: WHEN 70-(100 - Quote) * 10 > -80 THEN 70-(100 - Quote) * 10 ELSE -70

Fee: Bonus + 125

Gebühr 2: ALL * Fee

Wie kann ich diese 3 Spalten und Berechnung definieren in meiner Abfragevariable in der gespeicherten Prozedur?

Antwort

1

Sie benötigen CTE

SET NOCOUNT ON; 

DECLARE @colNo nvarchar(max) 
DECLARE @SUMCols nvarchar(max) 
DECLARE @query nvarchar(max) 


SET NOCOUNT ON; 

WITH vals AS (
    SELECT DISTINCT ds.[No] 
    FROM QRTestView ds 
) 

SELECT @colNo = COALESCE(@colNo + ', ', '') + QUOTENAME([No]), 
     @SUMCols = COALESCE(@SUMCols + ', ', '') + 'SUM(' + QUOTENAME([No]) +')' 
FROM vals 
ORDER BY No 


SELECT @query = N' 
;WITH cte as (
SELECT *, 
     [Bonus] + 125 as [Fee], 
     ([Bonus] + 125) * [ALL] as [Fee2] 
FROM (
    SELECT *, 
      CASE WHEN 70-(100 - Quote) * 10 > -80 THEN 70-(100 - Quote) * 10 ELSE -70 END as [Bonus] 
    FROM (
     SELECT *, 
       '+REPLACE(@colNo,',','+')+' as [ALL] 
     FROM (
      SELECT CAST(No as CHAR(12)) As No, 
        CAST(Quote as CHAR(7)) As Quote, 
        CAST(Quote as CHAR(7)) As Q 
      FROM QRTestView 
      WHERE Datum >= @from_val and Datum <= @to_val 
      ) AS sel 
      PIVOT (
       COUNT(Q) 
       FOR No IN ('[email protected]+') 
      ) AS p 
     ) AS d 
    ) as ff 
) 

SELECT * 
FROM (
    SELECT * 
    FROM cte 
    UNION ALL 
    SELECT ''ALL'', 
      '[email protected]+' 
      SUM([ALL]), 
      NULL, 
      NULL, 
      SUM(Fee2) 
    FROM cte 
    ) as t 
ORDER BY CASE WHEN Quote = ''ALL'' THEN 101 ELSE CAST(Quote as INT) END DESC' 

EXEC sp_executesql @query, N'@from_val datetime, @to_val datetime', @from_val = @from, @to_val = @to 
+0

Sehr schön zu bedienen! Ist es möglich, die Berechnung als deklarierte Variable etwas kürzer zu definieren? – yuro

+0

Ja, Sie können. Aber mit einer weiteren Unterabfrage. Siehe Änderungen. – gofr1

+0

in meinem letzten Thread, könnte ich das mit 'UNION ALL' tun? Ich meine diesen Thread -> [Link] (http://stackoverflow.com/questions/38607931/how-to-define-a-new-column-in-a-stored-procedure-query) – yuro