2013-06-03 11 views
8

Mam procedurę składowaną, do której dołączyłem dwa zapytania. moje pytania sąjak połączyć dwa zapytania w procedurze przechowywanej, aby uzyskać wynik w jednym wierszu

alter PROCEDURE test 

@SDate datetime, 
@EDate datetime 

Jak

-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- Insert statements for procedure here 
(Select count(quoteid) as TotalQuote, sum(totalamount) as QuoteAmount from dbo.QuoteBase 
where CreatedOn BETWEEN @SDate AND @EDate) 
union All 

(select count(salesorderid)as TotalOrders, sum(totalamount) as OrderAmount from dbo.SalesOrderBase Where 
CreatedOn BETWEEN @SDate AND @EDate) 

i mam doprowadzić do kolumny

Total Quote Quote Amount 
17     700 
118     5000 

ale chcę prowadzić jak

Total Quote Quote Amount Total Orders Order Amount 
    17    700    118   5000 

Jeśli ktoś ma pomysł, proszę podzielić ze mną

Odpowiedz

5

Spróbuj ten -

ALTER PROCEDURE dbo.usp_test 

     @SDate DATETIME 
    , @EDate DATETIME 

AS BEGIN 

    SET NOCOUNT ON; 

    SELECT 
      t.TotalQuote 
     , t.QuoteAmount 
     , t2.TotalOrders 
     , t2.OrderAmount 
    FROM (SELECT a = 1) a 
    CROSS JOIN (
     SELECT 
       TotalQuote = COUNT(quoteid) 
      , QuoteAmount = SUM(totalamount) 
     FROM dbo.QuoteBase 
     WHERE CreatedOn BETWEEN @SDate AND @EDate 
    ) t 
    CROSS JOIN (
     SELECT 
       TotalOrders = COUNT(salesorderid) 
      , OrderAmount = SUM(totalamount) 
     FROM dbo.SalesOrderBase 
     WHERE CreatedOn BETWEEN @SDate AND @EDate 
    ) t2 

END 

Aktualizacja:

SELECT 
     t.TotalQuote 
    , t.QuoteAmount 
    , t2.TotalOrders 
    , t2.OrderAmount 
FROM (
    SELECT 
      TotalQuote = COUNT(quoteid) 
     , QuoteAmount = SUM(totalamount) 
    FROM dbo.QuoteBase 
    WHERE CreatedOn BETWEEN @SDate AND @EDate 
) t 
FULL OUTER JOIN 
(
    SELECT 
      TotalOrders = COUNT(salesorderid) 
     , OrderAmount = SUM(totalamount) 
    FROM dbo.SalesOrderBase 
    WHERE CreatedOn BETWEEN @SDate AND @EDate 
) t2 ON 1 = 1 
+0

ma potrzeby '(Wybierz = 1) a'? – Andomar

+1

Jeśli użyjesz 'count' bez' group by', zawsze otrzymasz jeden wiersz z powrotem, nawet jeśli tabela jest pusta – Andomar

+0

@Andomar, dzięki za komentarz. – Devart

4

można użyć cross join zamiast union:

select q1.TotalQuote 
,  q1.QuoteAmount 
,  q2.TotalOrders 
,  q2.OrderAmount 
from (
     ... first query ... 
     ) q1 
cross join 
     (
     ... second query ... 
     ) q2 
Powiązane problemy