有没有办法可以将以下查询缩短为单个查询?

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)

Jam*_*s Z 6

是的,你应该能够做到,像这样:

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)