-1

私は次のテーブルを持っています:

  • 注文
  • 製品
  • ジョイントテーブルとしてのOrderDetails。

製品に接続されているCategoriesテーブルもあります。CategoryIDは、Productsの外部テーブルです。

1997年から1998年までの注文年、四半期、C文字で始まるカテゴリ名とSale(UDF)を含むテーブルを取得しようとしています。これが私が試したことです:

Select YEAR(o.OrderDate) AS "Year", DATENAME(Quarter, o.OrderDate) AS "Qtr",
       c.CategoryName,
       dbo.SaleAfterDiscount(od.UnitPrice, od.Quantity, od.Discount) AS "Sale"
  From Orders o, [Order Details] od, Categories c, Products p
 WHERE (YEAR(o.OrderDate)='1997'OR YEAR(o.OrderDate)='1998')
   AND c.CategoryName LIKE 'c%'
   AND od.OrderID = o.OrderID
   AND od.ProductID = p.ProductID
   AND c.CategoryID = p.CategoryID

しかし、私はたくさんの結果を得ます。それらをグループ化するか、クエリを修正して正しい答えを得るにはどうすればよいですか?

4

1 に答える 1

1
  1. 明示的なJOINを使用する
  2. 列で関数を使用しないでください
  3. 集計されていないすべての列でGROUPBY

このような:

Select
     YEAR(o.OrderDate) AS "Year",
     DATENAME(Quarter, o.OrderDate) AS "Qtr",
     c.CategoryName,
     SUM(dbo.SaleAfterDiscount(od.UnitPrice, od.Quantity, od.Discount)) AS "SaleSum"
From
     Orders o
     JOIN
     [Order Details] od ON od.OrderID=o.OrderID
     JOIN
     Products p ON od.ProductID=p.ProductID
     JOIN
     Categories c ON c.CategoryID=p.CategoryID
WHERE
     o.OrderDate >= '19970101' AND o.OrderDate < '19990101'
     AND
     c.CategoryName LIKE 'c%'
GROUP BY
     YEAR(o.OrderDate),
     DATENAME(Quarter, o.OrderDate),
     c.CategoryName;
于 2013-02-20T09:47:45.067 に答える