AnO*_*oul 1 performance sql-server optimization sql-server-2012 query-performance
我有以下查询。有没有一种方法可以将其放入一个查询中?如果没有,我可以进一步缩小它吗?请指教。
DECLARE @highRegion TABLE(regionId INT, countR INT)
DECLARE @lowRegion TABLE(regionId INT, countR INT)
DECLARE @midRegion TABLE(regionId INT, countR INT)
INSERT INTO @highRegion
SELECT c.fRegionID,
COUNT(1) AS VALUE
FROM census.Country c
INNER JOIN census.IncomeGroup ig
ON c.fIncomeGroupID = ig.IncomeGroupID
WHERE ig.Name IN ('High income: nonOECD', 'High income: OECD')
GROUP BY
c.fRegionID
INSERT INTO @lowRegion
SELECT c.fRegionID AS VALUE,
COUNT(1)
FROM census.Country c
INNER JOIN census.IncomeGroup ig
ON c.fIncomeGroupID = ig.IncomeGroupID
WHERE ig.Name = 'Upper middle income'
GROUP BY
c.fRegionID
INSERT INTO @midRegion
SELECT c.fRegionID,
COUNT(1) AS VALUE
FROM census.Country c
INNER JOIN census.IncomeGroup ig
ON c.fIncomeGroupID = ig.IncomeGroupID
WHERE ig.Name IN ('Lower middle income', 'Low income')
GROUP BY
c.fRegionID
SELECT r.Name,
r.NoOfCountries,
h.countR AS HIGH,
l.countR AS LOW,
m.countR AS mid
FROM census.Country c
INNER JOIN @highRegion h
ON c.fRegionID = h.regionId
INNER JOIN @lowRegion l
ON c.fRegionID = l.regionId
INNER JOIN @midRegion m
ON c.fRegionID = m.regionId
INNER JOIN census.Region r
ON c.fRegionID = r.RegionID
Run Code Online (Sandbox Code Playgroud)
是的,你应该能够做到,像这样:
SELECT r.Name,
r.NoOfCountries,
sum(case when ig.Name IN ('High income: nonOECD', 'High income: OECD') then 1 else 0 end) AS HIGH,
sum(case when ig.Name IN ('Lower middle income', 'Low income') then 1 else 0 end) AS LOW,
sum(case when ig.Name = 'Upper middle income' then 1 else 0 end) AS mid
FROM census.Country c
INNER JOIN census.Region r
ON c.fRegionID = r.RegionID
INNER JOIN census.IncomeGroup ig
ON c.fIncomeGroupID = ig.IncomeGroupID
group by
r.Name,
r.NoOfCountries
Run Code Online (Sandbox Code Playgroud)