2017-05-22 3 views
-1

Ist es möglich, die Ergebnisse aus den beiden Select-Anweisungen zu teilen und einen Gesamtwert von?Divide Union Ergebnisse

Desired Ergebnisse Required Results

Mein aktueller Code

select sum(U.Orders) as sumtotal 
from 
(
    select distinct count(p.PACKSLIP) as Orders 
    from PICKHEAD as p 
    where DATE_REQD = '2017-04-19' 

    union 

    select distinct count(s.PACKSLIP) as Orders 
    from SHIPHIST as s 
    where DATE_REQD = '2017-04-19' 
) AS U 
+0

Wie berechnet man den Prozentsatz der Fertigstellung? –

+0

Es ist nicht notwendig, "distinct" auszuwählen, da diese Unterabfragen nur eine Zeile zurückgeben. Verwenden Sie stattdessen UNION ALL, um das Ergebnis von select beizubehalten, wenn sie identisch sind. – jarlh

+0

@TimBiegeleisen Es wäre eine Division basierend auf den Ergebnissen von ship/sumtotal * 100 –

Antwort

0

Wenn ich Sie richtig verstanden habe, wollen Sie es

select sum(U.OrderList) + sum(U.Shiplist) as totalSalesOrder,sum(U.OrderList)/ (sum(U.Shiplist)+sum(U.OrderList)) * 100 as TotalComlpetionPercentage 
from 
(
    select distinct count(p.PACKSLIP) as OrderList, 0 as ShipList 
    from PICKHEAD as p 
    where DATE_REQD = '2017-04-19' 

    union 

    select distinct 0 as OrderList, count(s.PACKSLIP) as Shiplist 
    from SHIPHIST as s 
    where DATE_REQD = '2017-04-19' 
) AS U 
0

Mit nur einem Ergebnis von jeder Zählung, es kann getan werden mit einem Kreuz verbinden:

select P.Orders + S.Orders as [Total Sales], S.Orders * 100.0/(P.Orders + S.Orders) as [Total Completion Percentage] 
from (
     select count(p.PACKSLIP) as Orders 
     from PICKHEAD as p 
     where DATE_REQD = '2017-04-19' 
    ) as P 
cross join (
     select count(s.PACKSLIP) as Orders 
     from SHIPHIST as s 
     where DATE_REQD = '2017-04-19' 
    ) as S 
+0

Akzeptiert SQL Server einen INNER JOIN ohne ON-Klausel? – jarlh

+0

Ja. Es ist das selbe Ding. Beispiel: select * from (select Besten 1 Namen von sysobjects) eine Exklusionsverknüpfung (wähle Besten 1 Namen von sysobjects) b auf 1 = 1 select * from (select top 1 Name von sysobjects) ein Quer beitreten (wählen Sie Top 1 Name von sysobjects) b – cloudsafe

+1

Danke für die Info. (ANSI SQL erfordert eine ON- oder USING-Klausel.) – jarlh

2

Mit einem CROSS JOIN statt:

select pOrders + sOrders as sumtotal, 
     (pOrders * 100)/(pOrders + sOrders) 
from 
(
    select count(p.PACKSLIP) as pOrders 
    from PICKHEAD 
    where DATE_REQD = '2017-04-19' 
) as p 
cross join 
(
    select count(s.PACKSLIP) as sOrders 
    from SHIPHIST 
    where DATE_REQD = '2017-04-19' 
) as s 
+0

Das ist sehr nah, es ist die Berechnung des Prozentsatzes, der mir die Probleme jetzt verursacht. Idealerweise wäre es (sOrders/sumtotal) * 100, aber das funktioniert offensichtlich nicht –

+0

Kann getan werden, wenn Sie diese Abfrage in einer abgeleiteten Tabelle umbrechen. – jarlh

+0

Ich endete damit - Cast ((Cast (Shipped AS Dezimal (10,5))/(Inprocess + Shipped)) * 100 AS Dezimal (10,2)) –