3

私はこのようなテーブルを作ろうとしています:

製品名 | 販売日 | TotalSalesUntilDate

    A     |      5    |      15

    B     |     10    |      30

    C     |     20    |      25

    D     |     18    |      43

SalesByDate は入力日の各商品の販売数、TotalSalesUntilDate は月の初日から入力日までの各商品の販売数を表します (入力日の例: 2010 年 3 月 17 日)。

サブクエリを使用してこのクエリを作成しました。

    select p.ProductName, A.SalesByDate,
      (select(SUM(case when (pd.Date between '01' and @Date) 
      then s.SalesByDate else 0 end)) 
    from Period pd 
    inner join Sales s on pd.TimeID = s.TimeID 
    full join Product p on s.ProductID = p.ProductID) as TotalSalesUntilDate 
    from Product p join 
         (select s.ProductID, pd.Date, s.SalesByDate
          from Period pd join Sales s on pd.TimeID = s.TimeID) A on 
    p.ProductID = A.ProductID where @Date = A.Date

しかし、私は結果を得ました:

製品名 | 販売日 | TotalSalesUntilDate

     A    |     5     |      113

     B    |    10     |      113

     C    |    20     |      113

     D    |    18     |      113

TotalSalesUntilDate は、月の最初の日から入力日までに販売された製品の数を示しますが、製品ごとに区切られていないすべての製品についてです。

したがって、クエリを次のように変更しようとしたとき (「as TotalSalesUntilDate」の前に GROUP BY p.ProductID を追加):

   select p.ProductName, A.SalesByDate,
     (select(SUM(case when (pd.Date between '01' and @Date) 
     then s.SalesByDate else 0 end)) 
   from Period pd 
     inner join Sales s on pd.TimeID = s.TimeID 
     full join Product p on s.ProductID = p.ProductID 
     group by p.ProductID) as TotalSalesUntilDate 
  from Product p join 
     (select s.ProductID, pd.Date, s.SalesByDate
     from Period pd join Sales s on pd.TimeID = s.TimeID) A on 
    p.ProductID = A.ProductID where @Date = A.Date

このクエリを実行すると、次のエラー メッセージが表示されました。

「メッセージ 512、レベル 16、状態 1、プロシージャ SalesMTDSubQuery、行 7 サブクエリが複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後にある場合、またはサブクエリが使用されている場合、これは許可されません。表現として。」

私はSQLが初めてで、まだ学んでいるので、これを解決する方法がわかりません。どんな助けでも大歓迎です。ありがとうございました。

4

2 に答える 2