2015-01-07 17 views
7

ho una stored procedure con la seguente query:Raggruppa e ORDER BY con UNION ALL

SELECT (sum(addition)) AS [COUNT], 
MAX(CONVERT(VARCHAR(12),CREATED,102)) as [date] 
FROM [TABLE_ONE] 
WHERE convert(VARCHAR(12),CREATED,102) BETWEEN CONVERT(date,@startdate) AND CONVERT(date,@enddate) 
AND [ServiceID][email protected] 
GROUP BY CONVERT(VARCHAR(12),CREATED,102) 
ORDER BY CONVERT(VARCHAR(12),CREATED,102) 

ho bisogno di fare un union all, così ho potuto ottenere somma dei risultati, ma da due tabelle, e Voglio che il risultato sia raggruppato e ordinato allo stesso modo.

Questo non funziona:

SELECT (sum(addition)) AS [COUNT], 
MAX(CONVERT(VARCHAR(12),CREATED,102)) as [date] 
FROM [TABLE_ONE] 
WHERE convert(VARCHAR(12),CREATED,102) BETWEEN CONVERT(date,@startdate) AND CONVERT(date,@enddate) 
AND [ServiceID][email protected] 
GROUP BY CONVERT(VARCHAR(12),CREATED,102) 
ORDER BY CONVERT(VARCHAR(12),CREATED,102) 

UNION ALL 

SELECT (sum(addition)) AS [COUNT], 
MAX(CONVERT(VARCHAR(12),CREATED,102)) as [date] 
FROM [TABLE_TWO] 
WHERE convert(VARCHAR(12),CREATED,102) BETWEEN CONVERT(date,@startdate) AND CONVERT(date,@enddate) 
AND [ServiceID][email protected] 
GROUP BY CONVERT(VARCHAR(12),CREATED,102) 
ORDER BY CONVERT(VARCHAR(12),CREATED,102) 

voglio ordinare il risultato complessivo, e il gruppo entro la data.

+0

È possibile ordinare solo il risultato complessivo di un'unione, non ogni singola query. –

+0

@a_horse_with_no_name è esattamente quello che voglio. Sono stato in grado di ordinare il risultato complessivo, ma non posso raggrupparlo – HelpASisterOut

+0

Hai provato a utilizzare una subquery con alias quindi raggruppare in alias.field_name? – chridam

risposta

11

si potrebbe applicare il group by e order by dopo il union all:

SELECT (SUM(addition)) AS [COUNT], MAX([date]) AS [max_date] 
FROM (SELECT addition, CONVERT(VARCHAR(12),CREATED,102)) as [date] 
     FROM [TABLE_ONE] 
     WHERE CONVERT(VARCHAR(12),CREATED,102) 
        BETWEEN CONVERT(date,@startdate) AND 
          CONVERT(date,@enddate) 
       AND [ServiceID][email protected] 
     UNION ALL 
     SELECT addition, (CONVERT(VARCHAR(12),CREATED,102)) as [date] 
     FROM [TABLE_TWO] 
     WHERE CONVERT(VARCHAR(12),CREATED,102) 
        BETWEEN CONVERT(date,@startdate) AND 
          CONVERT(date,@enddate) 
       AND [ServiceID][email protected]) t 
GROUP BY [date] 
ORDER BY 2 
+0

Ho provato quello naturalmente. Ma ha il nome della colonna "data" non valido. – HelpASisterOut

+0

probabilmente correlato agli alias: modificato, dovrebbe funzionare ora. – Mureinik