2

タスクは、年間利益が最小のサブカテゴリを選択することです。次のクエリでは、1年にいくつかのサブカテゴリを選択します。

select 
  min (Profit), 
  CalendarYear, 
  EnglishProductSubcategoryName
from (
  select 
    SUM(fis.SalesAmount-fis.TotalProductCost) Profit, 
    t.CalendarYear, 
    sc.EnglishProductSubCategoryName
    from FactInternetSales fis 
    inner join DimProduct p 
            on fis.ProductKey = p.ProductKey
    inner join DimProductSubcategory sc 
            on p.ProductSubcategoryKey = sc.ProductSubcategoryKey
    inner join DimTime t 
            on fis.DueDateKey = t.TimeKey
    group by CalendarYear, EnglishProductSubcategoryName) aa 
    --Order by CalendarYear
) aa
group by CalendarYear, EnglishProductSubcategoryName
order by CalendarYear 
4

1 に答える 1

1

特定の年の利益が最小のカテゴリを見つけたい場合は、クエリを書き直す必要があります。

select 
    Profit,
    CalendarYear, 
    EnglishProductSubcategoryName
from 
    (..... ) aa
where
    CalendarYear = 2011
    AND Profit = (SELECT MIN(Profit) FROM aa WHERE aa.CalendarYear = 2011)

これにより、サブクエリによって返される最小の利益 (2011 年) を持つ行 (複数の場合もあります) が見つかります。

更新:毎年の最小利益が必要なので、おそらくこのクエリを次のように完全に書き直します。

;WITH YearlyProfitsByCategory AS
(
   SELECT
      SUM(fis.SalesAmount - fis.TotalProductCost) Profit, 
      t.CalendarYear, 
      sc.EnglishProductSubCategoryName
   FROM
      dbo.FactInternetSales fis 
   INNER JOIN
      dbo.DimProduct p ON fis.ProductKey = p.ProductKey
   INNER JOIN
      dbo.DimProductSubcategory sc ON p.ProductSubcategoryKey = sc.ProductSubcategoryKey
   INNER JOIN
      dbo.DimTime t ON fis.DueDateKey = t.TimeKey
   GROUP BY
      t.CalendarYear, 
      sc.EnglishProductSubCategoryName
),
YearlyMinProfits AS 
(
    SELECT
       CalendarYear, 
       EnglishProductSubCategoryName,
       Profit,
       RowNum = ROW_NUMBER() OVER (PARTITION BY CalendarYear ORDER BY Profit)
    FROM YearlyProfitsByCategory 
)
SELECT 
   CalendarYear, EnglishProductSubCategoryName, Profit
FROM YearlyMinProfits
WHERE RowNum = 1  -- the row with the smallest profit, for every year

これは、CTE (Common Table Expression) とROW_NUMBER()ランキング関数を使用します - どちらも SQL Server 2005以降で利用できます (質問でバージョンについて言及していません)。

于 2012-12-09T09:27:14.290 に答える