2016-08-29 1 views
-1

Может ли кто-нибудь сказать мне, как решить эту проблему?Подзапрос возвратил более 1 значения. когда подзапрос используется как выражение.in SQL Server

Вот мой код

подзапросов:

SELECT 
    A.StoreNo, C.[date], A.ProductBarCode, A.ProductQty 
INTO 
    ##inv1 
FROM 
    #calender C 
OUTER APPLY 
    (SELECT TOP 100 PERCENT * 
    FROM ##Temp I 
    WHERE I.Date < C.DATE 
     AND StoreNo IN (SELECT StoreNo FROM ##StoreList) 
    ORDER BY I.Date) A 
OPTION (maxrecursion 0) 

Я использовал 100 топ процентов, потому что у меня есть более чем 1000 productBarcode для каждого storeNo, если я выбираю топ 1 его показ только один productBarcode повторяющееся значение для следующего день.

Declare 
    @pheader nvarchar(Max), @sql_pivot nvarchar(max) 

Begin 
    SELECT 
     @pheader = STUFF((SELECT distinct ',' + QUOTENAME([StoreNo]) 
          FROM ##StoreList 
          FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 
     --SET @pheader = LEFT(@pheader, LEN(@pheader) - 1) 
                         SET @sql_pivot = 'SELECT * 
          FROM 
           (SELECT 
            S.[StoreNo], p.Date as Date, 
            p.ProductBarCode as ProductBarCode, 
            ISNULL(i.productqty - (SELECT ProductQty as runningsum 
                  FROM #Stock st 
                  WHERE st.date <= i.date 
                  AND st.storeno = i.storeno 
                  AND st.ProductBarCode = i.ProductBarCode), i.productqty) as ProductQty 

           FROM #inventory i 
           LEFT JOIN ##StoreList S ON S.StoreNo = i.StoreNo 
           LEFT JOIN #Stock st ON st.StoreNo = i.StoreNo AND st.ProductBarCode = i.ProductBarCode AND st.Date = i.Date 
           RIGHT JOIN ##product p ON i.Date = P.Date and p.ProductBarCode = i.ProductBarCode 
           -- where p.ProductBarCode IN(2300007115072,2300012213046,2300012712075) 
           GROUP BY S.storeNo, i.StoreNo, i.ProductBarCode, i.Date, p.ProductBarCode, p.Date, i.ProductQty) p 

          PIVOT (SUM(ProductQty) 
           FOR [StoreNo] IN ('+ @pheader+'))Pvt' 

     EXECUTE sp_executesql @sql_pivot 

Я не могу получить 3:57 storeNo в то время, если я выбрать более 10 его показ этой ошибки

Subquery вернулся более чем на 1 значение. Это недопустимо, если подзапрос следует за =,! =, <, < =,>,> = или когда подзапрос используется как выражение.

Я использую SQL Server.

+3

Сообщение об ошибке объясняет проблему довольно четко. У вас есть подзапрос, возвращающий более одного значения. Итак, где у вас есть подзаголовок? Я вижу только один, который рассказывает вам, где именно происходит эта проблема. Поэтому извлеките эту часть и выясните, что возвращает более одной строки для этого запроса. –

ответ

-1

Добавить топ 1 к вашему подзапросу. попробуйте вот так,

DECLARE @pheader NVARCHAR(Max) 
    ,@sql_pivot NVARCHAR(max) 

BEGIN 
    SELECT @pheader = STUFF((
       SELECT DISTINCT ',' + QUOTENAME([StoreNo]) 
       FROM ##StoreList 
       FOR XML PATH('') 
        ,TYPE 
       ).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 

    SET @pheader = LEFT(@pheader, LEN(@pheader) - 1) 
    SET @sql_pivot = 
     'SELECT * 
          FROM 
           (SELECT 
            S.[StoreNo], p.Date as Date, 
            p.ProductBarCode as ProductBarCode, 
            ISNULL(i.productqty - (SELECT top 1 ProductQty as runningsum 
                  FROM #Stock st 
                  WHERE st.date <= i.date 
                  AND st.storeno = i.storeno 
                  AND st.ProductBarCode = i.ProductBarCode), i.productqty) as ProductQty 

           FROM #inventory i 
           LEFT JOIN ##StoreList S ON S.StoreNo = i.StoreNo 
           LEFT JOIN #Stock st ON st.StoreNo = i.StoreNo AND st.ProductBarCode = i.ProductBarCode AND st.Date = i.Date 
           RIGHT JOIN ##product p ON i.Date = P.Date and p.ProductBarCode = i.ProductBarCode 
           -- where p.ProductBarCode IN(2300007115072,2300012213046,2300012712075) 
           GROUP BY S.storeNo, i.StoreNo, i.ProductBarCode, i.Date, p.ProductBarCode, p.Date, i.ProductQty) p 

          PIVOT (SUM(ProductQty) 
           FOR [StoreNo] IN (' 
     + @pheader + '))Pvt' 

    EXECUTE sp_executesql @sql_pivot 
END