webForumDet fria alternativet

Select på en select

1 svar · 307 visningar · startad av wazid

wazidMedlem sedan maj 2001156 inlägg
#1

Hej

Jag undrar om man kan lägga ihop följande två selectsatser till att köra i samma fråga? (Select from select)

Idag kör jag i två steg för att få fram resultatet.
Fråga ett sparar jag som en tabell. Och det är på denna tabellen som jag ställer den andra frågan.


SELECT DISTINCT 
                      TOP 100 PERCENT SUM(dbo.OSBSTD.UCSAAM) AS Oms, SUM(dbo.OSBSTD.UCUCOS) AS TVK, dbo.MITMAS.MMITDS, dbo.MITMAS.MMITNO, 
                      dbo.MITBAL.MBEOQT, dbo.MITBAL.MBWHLO, dbo.MITMAS.MMITCL, SUM(dbo.OSBSTD.UCIVQT) AS Antal
FROM         dbo.OSBSTD INNER JOIN
                      dbo.MITMAS ON dbo.OSBSTD.UCITNO = dbo.MITMAS.MMITNO LEFT OUTER JOIN
                      dbo.MITBAL ON dbo.MITMAS.MMITNO = dbo.MITBAL.MBITNO
WHERE     (dbo.OSBSTD.UCIVDT BETWEEN '20040101' AND '20050101')
GROUP BY dbo.MITMAS.MMITCL, dbo.MITMAS.MMITDS, dbo.MITMAS.MMITNO, dbo.MITMAS.MMSTAT, dbo.MITBAL.MBEOQT, dbo.MITBAL.MBWHLO
HAVING      (dbo.MITMAS.MMSTAT < '50') AND (dbo.MITBAL.MBWHLO = '001') AND (dbo.MITMAS.MMITCL <> '999')
ORDER BY dbo.MITMAS.MMITNO, SUM(dbo.OSBSTD.UCSAAM) DESC

SELECT     TOP 100 PERCENT MMITNO, MMITDS, 1 - TVK / Oms AS TG, TVK, Oms, MBEOQT, Antal, Antal / MBEOQT AS omshast, (Antal / MBEOQT) * (1 - TVK / Oms)
                       AS Dupont, MMITCL
FROM         dbo.omsättning_med_tvk_o_orderkvant
WHERE     (MBEOQT <> 0) AND (Oms <> 0)
ORDER BY MMITCL, (Antal / MBEOQT) * (1 - TVK / Oms)
LarsGMedlem sedan dec. 200012 464 inlägg
#2
SELECT  MMITNO, 
        MMITDS, 
        1 - TVK / Oms AS TG, 
        TVK, 
        Oms, 
        MBEOQT, 
        Antal, 
        Antal / MBEOQT AS omshast, 
       (Antal / MBEOQT) * (1 - TVK / Oms) AS Dupont, 
       MMITCL
from (
SELECT SUM(dbo.OSBSTD.UCSAAM) AS Oms, 
       SUM(dbo.OSBSTD.UCUCOS) AS TVK, 
       dbo.MITMAS.MMITDS, 
       dbo.MITMAS.MMITNO, 
       dbo.MITBAL.MBEOQT, 
       dbo.MITBAL.MBWHLO, 
       dbo.MITMAS.MMITCL, 
       SUM(dbo.OSBSTD.UCIVQT) AS Antal
FROM   dbo.OSBSTD 
INNER JOIN dbo.MITMAS ON dbo.OSBSTD.UCITNO = dbo.MITMAS.MMITNO 
INNER JOIN dbo.MITBAL ON dbo.MITMAS.MMITNO = dbo.MITBAL.MBITNO
WHERE dbo.OSBSTD.UCIVDT BETWEEN '20040101' AND '20050101'
and dbo.MITMAS.MMSTAT < '50'
and dbo.MITBAL.MBWHLO = '001'
and dbo.MITMAS.MMITCL <> '999'
GROUP BY dbo.MITMAS.MMITCL, 
         dbo.MITMAS.MMITDS, 
         dbo.MITMAS.MMITNO, 
         dbo.MITMAS.MMSTAT, 
         dbo.MITBAL.MBEOQT, 
         dbo.MITBAL.MBWHLO) dt
WHERE MBEOQT <> 0
 AND  Oms <> 0
ORDER BY MMITCL, 
         Dupont

Då du har group by så finns det ingen anledning att även ha distinct.
Din left join blir i praktiken en inner join eftersom du har villkor på tabellen mitbal i where-klausulen.
Det finns ingen anledning att använda having eftersom du inte använder någon aggregatfunktion i villkoret.
Att skriva top 100 percent är meningslöst i största allmänhet.

134 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)