【发布时间】:2016-04-19 14:21:12
【问题描述】:
我有一张手提袋的桌子,上面有一个名为 [Tote] 的站点,如下所示:
Id Barcode Checksum PackageType Sts Destination LastStationExit LastUpdated
----------- ------------------ ----------- ----------- ----------- ----------- --------------- -----------------------
-2147483645 777000000000000001 586965230 0 1 NULL MS32 2016-04-19 14:15:32.577
-2147483644 777000000000000002 821846254 0 1 MS01 NULL 2016-04-19 15:08:16.140
-2147483643 777000000000000003 1174167790 0 1 NULL MS02 2016-04-19 15:08:20.340
-2147483642 777000000000000004 1543266542 0 1 NULL MS31 2016-04-19 15:08:24.510
-2147483641 777000000000000005 3424831 0 1 NULL MS01 2016-04-19 15:08:31.060
-2147483640 777000000000000006 573850175 0 1 MS01 NULL 2016-04-19 15:08:34.200
我有另一个表,其中包含所有名为 [MezzanineStation] 的现有站:
Name
----
MS01
MS02
MS11
MS12
MS21
MS22
MS31
MS32
我正在尝试计算每个车站有多少手提箱 (Destination=StationName) 以及有多少手提箱进入车站 (LastStationExit=StationName)。
我写了以下正常工作的请求:
-- Création d'une variable tampon pour isoler les bacs concernés par le calcul
DECLARE @FilteredToteExtract TABLE
(
Destination Varchar(4),
LastStationExit Varchar(4)
)
INSERT INTO @FilteredToteExtract([Destination],[LastStationExit])
SELECT [Destination],[LastStationExit]
FROM [Tote] T
WHERE [PackageType]=0
AND LastUpdated>=DATEADD(HOUR,-12,GETDATE())
AND EXISTS (SELECT * FROM [MezzanineStation] MS WHERE MS.[Name]=T.[Destination] OR MS.[Name]=T.[LastStationExit])
-- Calcul de l'occupation (prévue et courante) des gares de la mezzanine
SELECT DISTINCT MS.Name,T_Destination.[Count] AS NbTotesOngoing,T_LastStationExit.[Count] AS NbTotesInside
FROM [MezzanineStation] MS
LEFT JOIN
( SELECT
Destination,
COUNT(*) AS [Count]
FROM @FilteredToteExtract
GROUP BY Destination
) T_Destination
ON MS.Name = T_Destination.Destination
LEFT JOIN
( SELECT
LastStationExit,
COUNT(*) AS [Count]
FROM @FilteredToteExtract
GROUP BY LastStationExit
) T_LastStationExit
ON MS.Name = T_LastStationExit.LastStationExit
它给了我这样的结果:
Name NbTotesOngoing NbTotesInside
---- -------------- -------------
MS01 2 1
MS02 NULL 1
MS11 NULL NULL
MS12 NULL NULL
MS21 NULL NULL
MS22 NULL NULL
MS31 NULL 1
MS32 NULL NULL
这是我在 [Tote] 表上创建的索引:
CREATE INDEX IX_Tote_PackageType ON [Tote]([PackageType])
CREATE INDEX IX_Tote_LastStationExit ON [Tote]([LastStationExit])
CREATE INDEX IX_Tote_LastUpdated ON [Tote]([LastUpdated])
你认为这个请求可以更优化吗?
【问题讨论】:
标签: tsql count query-optimization