2013-06-03 16 views
8

İki sorguya katıldığım bir saklı yordamım var. Benim sorgularıBir satırda sonuç elde etmek için saklı yordamda iki sorgunun birleştirilmesi

-- 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) 

olarak

alter PROCEDURE test 

@SDate datetime, 
@EDate datetime 

ve ben sütunda

Total Quote Quote Amount 
17     700 
118     5000 

için neden var ama ben paylaşan lütfen kimse fikriniz varsa

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

gibi sonuçlanır istiyorum benimle

cevap

5

deneyin bu bir -

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 

Güncelleme: `(a SEÇ için

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

gerek yok = 1) a'? – Andomar

+1

Eğer 'count' işlevini' 'group' 'kullanmadan kullanırsanız, tablonun boş olmasına rağmen her zaman bir satır geri alırsınız, – Andomar

+0

@Andomar, yorumunuz için teşekkürler. – Devart

4

Bir cross join yerine union a kullanabilirsiniz:

select q1.TotalQuote 
,  q1.QuoteAmount 
,  q2.TotalOrders 
,  q2.OrderAmount 
from (
     ... first query ... 
     ) q1 
cross join 
     (
     ... second query ... 
     ) q2 
İlgili konular