Zwracanie tylko jednej wartości podzapytania MSSQL

0

Cześć, jestem na początku mojej przygody z SQLem i napotkałem problem, którego nie mogę ruszyć. Potrzebuję procedury, która zwróci mi sprzedaż z tygodnia, dwóch tygodni i policzy pokrycie w dniach. Próbowałem napisać, ale podzapytania zwracają mi niestety tylko jeden wynik (TOP 1 dodane po błędzie: Msg 512, Level 16, State 1, Procedure str_zaap, Line 6 [Batch Start Line 0]
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.) Czy jest jakaś szansa na to, żeby podzapytanie zwracało więcej niż jeden wynik?

CREATE PROCEDURE str_zaap
@data datetime,
@WH nchar(20)
AS
BEGIN
SELECT DISTINCT
Stock.skuCode,
Stock.Qty AS 'Stan_magazynowy',
Stock.WH,
Cat.Cat1 AS 'Kategoria',
(SELECT TOP 1 sum(Sales.Qty) FROM SCRE.dbo.tSales AS Sales WHERE (Sales.Date between @data-6 and @data) GROUP BY sales.skuCode) AS '7_dni',
(SELECT TOP 1 sum(Sales.Qty) FROM SCRE.dbo.tSales AS Sales WHERE (Sales.Date between @data-13 and @data) GROUP BY sales.skuCode) AS '14-dni',
stock.qty/((SELECT TOP 1 sum(Sales.Qty) FROM SCRE.dbo.tSales AS Sales WHERE (Sales.Date between @data-13 and @data)GROUP BY sales.skuCode)/'14') AS 'Pokrycie'
FROM
SCRE.dbo.tStockPTK AS Stock,
SCRE.dbo.tSales AS Sales,
SCRE.dbo.tItems AS Items,
SCRE.dbo.tItemsCat AS Cat

WHERE
Stock.skuCode=Sales.skuCode AND
Stock.skuCode=Items.skuCode AND
Sales.skuCode=Items.skuCode AND
Cat.IdCat=Items.IdCat AND
Cat.Cat1=Items.Cat1 AND
Stock.WH = @WH
END

0

Te podzapytania nie mają sensu, liczysz tam wszystkie ilości z tablicy sprzedaży no i niby grupujesz po skuCode ale to nic nie daje . Musisz te zapytania zrobić osobno i dodać za pomocą INNER JOIN (względnie LEFT jeśli chcesz widzieć wszystkie kody z tablicy stock .. nie tylko te co miały sprzedasz) łącząc po kodzie (i może po magazynie jeśli sprzedasz jest też per magazyn).

0

To powinno w ogóle nie zadziałać ' nie służy do otaczania nazwy kolumny, do tego użyj nawiasów: []

Bez podzapytań, można tak:

SELECT 
	Stock.skuCode,
	Stock.WH,
	Cat.Cat1 AS [Kategoria],
	--(SELECT TOP 1 sum(Sales.Qty) FROM SCRE.dbo.tSales AS Sales WHERE (Sales.Date between @data-6 and @data) GROUP BY sales.skuCode) AS '7_dni',
	sum(CASE WHEN Sales.Date between @data-6 and @data THEN Sales.Qty ELSE 0 END) AS [7 DNI],
	--(SELECT TOP 1 sum(Sales.Qty) FROM SCRE.dbo.tSales AS Sales WHERE (Sales.Date between @data-13 and @data) GROUP BY sales.skuCode) AS '14-dni',
	sum(Sales.Qty) AS [14-dni]
	--NIE WIEM CO TY LICZYSZ TYM POKRYCIEM
	--stock.qty/((SELECT TOP 1 sum(Sales.Qty) FROM SCRE.dbo.tSales AS Sales WHERE (Sales.Date between @data-13 and @data)GROUP BY sales.skuCode)/'14') AS 'Pokrycie'
FROM
	SCRE.dbo.tStockPTK AS Stock
	INNER JOIN SCRE.dbo.tSales AS Sales ON Stock.skuCode=Sales.skuCode
	INNER JOIN SCRE.dbo.tItems AS Items ON Stock.skuCode=Items.skuCode 
						AND Sales.skuCode=Items.skuCode
	INNER JOIN SCRE.dbo.tItemsCat AS Cat ON Cat.IdCat=Items.IdCat 
						AND Cat.Cat1=Items.Cat1
WHERE
	Stock.WH = @WH
	AND Sales.Date between @data-13 and @data
GROUP BY
	Stock.skuCode,
	Stock.WH,
	Cat.Cat1

1 użytkowników online, w tym zalogowanych: 0, gości: 1