다음과 같은 테이블을 만들려고합니다.
ProductName | SalesByDate | TotalSalesUntilDate
A | 5 | 15 B | 10 | 30 C | 20 | 25 D | 18 | 43
SalesByDate는 입력일에 각 상품별로 판매 된 상품수를 의미하고 TotalSalesUntilDate는 해당 월의 1 일부터 입력일까지 각 상품별로 판매 된 상품수를 나타냅니다 (입력 일자 예시 : 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
하지만 결과를 얻었습니다.
ProductName | SalesByDate | TotalSalesUntilDate
A | 5 | 113 B | 10 | 113 C | 20 | 113 D | 18 | 113
TotalSalesUntilDate는 매월 첫 번째 날짜부터 입력 날짜까지 판매 된 제품 수를 표시하지만 각 제품에 대해 분리되지 않은 모든 제품에 대해 표시됩니다.
따라서 쿼리를 다음과 같이 변경하려고 할 때 ( "To 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
이 쿼리를 실행하면 다음과 같은 오류 메시지가 나타납니다.
"Msg 512, 수준 16, 상태 1, 프로 시저 SalesMTDSubQuery, 줄 7 하위 쿼리가 둘 이상의 값을 반환했습니다. 하위 쿼리가 =,! =, <, <=,>,> = 다음에 오는 경우 또는 하위 쿼리가 사용되는 경우 이는 허용되지 않습니다. 표현으로. "
나는 SQL에 익숙하지 않고 여전히 배우고 있지만 이것을 해결하는 방법을 이해하지 못합니다. 어떤 도움을 주시면 감사하겠습니다. 감사합니다.
에서 @Date
변수 우리는 날짜를 저장하는 :
SELECT DISTINCT PT.[ProductName]
,SUM(IIF(PD.[Date] = @Date, SL.[SalesByDate], 0))
,SUM(IIF(PD.[Date] BETWEEN '01' AND @Date, SL.[SalesByDate], 0))
FROM @Product PT
INNER JOIN @Sales SL
ON PT.[ProductID] = SL.[ProductID]
INNER JOIN @Period PD
ON SL.[TimeID] = PD.[TimeID]
GROUP BY PT.[ProductName]
결과:
전체 코드 :
DECLARE @Period TABLE
(
[TimeID] TINYINT
,[Date] CHAR(2)
)
INSERT INTO @Period([TimeID], [Date])
VALUES (1,'01')
,(2,'02')
,(3,'03')
,(4,'04')
,(5,'05')
,(6,'06')
,(7,'07')
,(8,'08')
,(9,'09')
,(10,'10')
,(11,'11')
,(12,'12')
,(13,'13')
,(14,'14')
,(15,'15')
DECLARE @Product TABLE
(
[ProductID] TINYINT
,[ProductName] CHAR(1)
)
INSERT INTO @Product( [ProductID], [ProductName])
VALUES (1,'A')
,(2,'B')
,(3,'C')
,(4,'D')
DECLARE @Sales TABLE
(
[TimeID] TINYINT
,[ProductID] TINYINT
,[SalesByDate] TINYINT
)
INSERT INTO @Sales ([TimeID], [ProductID], [SalesByDate])
VALUES (1, 1, 10)
,(1, 4, 20)
,(7, 2, 10)
,(7, 3, 5)
,(15, 1, 5)
,(15, 2, 10)
,(15, 3, 15)
,(15, 4, 18)
,(19, 2, 15)
,(20, 3, 2)
,(22, NULL, 2)
,(1, 4, 5)
,(7, 2, 10)
,(15, 3, 5)
DECLARE @Date CHAR(2) = '15'
SELECT DISTINCT PT.[ProductName]
,SUM(IIF(PD.[Date] = @Date, SL.[SalesByDate], 0))
,SUM(IIF(PD.[Date] BETWEEN '01' AND @Date, SL.[SalesByDate], 0))
FROM @Product PT
INNER JOIN @Sales SL
ON PT.[ProductID] = SL.[ProductID]
INNER JOIN @Period PD
ON SL.[TimeID] = PD.[TimeID]
GROUP BY PT.[ProductName]
편집하다:
하위 쿼리를 사용해야하는 경우 예제가 작동하는 방법은 다음과 같습니다.
SELECT PT.[ProductName]
,SUM(SL.[SalesByDate])
,DataSource.[TotalSalesByDate]
FROM @Product PT
INNER JOIN @Sales SL
ON PT.[ProductID] = SL.[ProductID]
INNER JOIN @Period PD
ON SL.[TimeID] = PD.[TimeID]
INNER JOIN
(
SELECT S.[ProductID]
,SUM(S.[SalesByDate]) AS [TotalSalesByDate]
FROM @Sales S
INNER JOIN @Period P
ON S.[TimeID] = P.[TimeID]
WHERE P.[Date] BETWEEN '01' AND @Date
GROUP BY S.[ProductID]
) AS DataSource
ON PT.[ProductID] = DataSource.[ProductID]
WHERE PD.[Date] = @Date
GROUP BY PT.[ProductName]
,DataSource.[TotalSalesByDate]
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다