0

タイトルのエラーのために動作を停止した次のスクリプトがあります。誰か助けてもらえますか?

SELECT DISTINCT TOP 100 PERCENT
         Locs.lCustomerGroupPK, Locs.lCustomerID, Locs.Customer_Group_Name, Locs.Customer_Name, Locs.Location_Name, TY.ThisYearsSales,
        (SELECT ThisYearsSales
           FROM dbo.Vw_Level_3_Sales_This_Year
          WHERE (lLocationID = Locs.lLocationID2 OR lLocationID = Locs.llocationid)
            AND (Current_Read_Date = TY.Current_Read_Date - 364) AND (ThisYearsSales <= 400)
         ) AS LastYearsSales, 
         TY.Current_Read_Date - 1 AS Current_Read_Date INTO #tmplocationlflsales
  FROM dbo.Vw_Level_3_Sales_This_Year AS TY 
        INNER JOIN dbo.vw_locations_Like_For_Like_Previous AS Locs 
                ON TY.lLocationID = Locs.llocationid OR TY.lLocationID = Locs.lLocationID2
 WHERE (TY.ThisYearsSales <= 400)
    AND (TY.Current_Read_Date = @RecordDate)
    AND TY.ThisYearsSales IS NOT NULL
    AND (SELECT ThisYearsSales
           FROM dbo.Vw_Level_3_Sales_This_Year
          WHERE (lLocationID = Locs.lLocationID2 OR lLocationID = Locs.llocationid) 
            AND (Current_Read_Date = TY.Current_Read_Date - 364) 
            AND (ThisYearsSales <= 400)
         ) IS NOT NULL 
 ORDER BY Locs.Customer_Group_Name, Locs.Customer_Name, Locs.Location_Name, Current_Read_Date
4

2 に答える 2

0

私が見る限り、スクリプトにこのサブクエリがあります

SELECT ThisYearsSales
FROM dbo.Vw_Level_3_Sales_This_Year
WHERE (lLocationID = Locs.lLocationID2 OR lLocationID = Locs.llocationid) 
 AND (Current_Read_Date = TY.Current_Read_Date - 364) 
 AND (ThisYearsSales <= 400)

これが単一の値(1つのレコードに1つの列)を返す場合は、結果に含まれますが、これが複数の行を返す場合は、発生しているエラーが発生します。

Vw_Level_3_Sales_This_Yearビューのデータを見て、lLocationID / Current_Read_Dateごとに重複があるかどうかを確認します。これは、これらがフィルタリング対象のフィールドであるためです。次のようなもの:

SELECT count(*), lLocationID, Current_Read_Date 
FROM dbo.Vw_Level_3_Sales_This_Year
GROUP BY lLocationID, Current_Read_Date 
HAVING count(*)>1

このクエリによって返される行は、問題がどこにあるかを示しているはずです。

于 2012-07-25T13:09:59.533 に答える
0

問題は、SELECT のサブクエリにあるようです。

        SELECT ThisYearsSales
        FROM dbo.Vw_Level_3_Sales_This_Year
        WHERE (lLocationID = Locs.lLocationID2 OR 
                lLocationID = Locs.llocationid) 
            AND (Current_Read_Date = TY.Current_Read_Date - 364) 
            AND (ThisYearsSales <= 400)

これはあまりにも多くの行を返しています。おそらく、次のように変更したいと思うでしょう:

        SELECT sum(ThisYearsSales)
        FROM dbo.Vw_Level_3_Sales_This_Year
        WHERE (lLocationID = Locs.lLocationID2 OR 
                lLocationID = Locs.llocationid) 
            AND (Current_Read_Date = TY.Current_Read_Date - 364) 
            AND (ThisYearsSales <= 400)

同じサブクエリを 2 回使用するため、実際には FROM 句に配置する必要があります。

于 2012-07-25T13:07:31.943 に答える