하위 쿼리 T-SQL의 GROUP BY

SQLnubie

다음과 같은 테이블을 만들려고합니다.

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에 익숙하지 않고 여전히 배우고 있지만 이것을 해결하는 방법을 이해하지 못합니다. 어떤 도움을 주시면 감사하겠습니다. 감사합니다.

gotqn

에서 @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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

하위 쿼리의 MySQL GROUP_CONCAT

분류에서Dev

SQL의 하위 쿼리에서 Group by 사용

분류에서Dev

T-SQL 뷰 하위 쿼리 Where 절

분류에서Dev

C #의 SQL 하위 쿼리

분류에서Dev

AND 문의 SQL 하위 쿼리

분류에서Dev

GROUP BY를 사용하는 하위 쿼리의 MySQL COUNT

분류에서Dev

GROUP BY를 사용하는 MySQL의 매우 느린 하위 쿼리

분류에서Dev

하위 쿼리 및 GROUP BY를 사용한 MySQL SELECT의 성능

분류에서Dev

SQL 및 Group By 쿼리

분류에서Dev

Group by 및 Join을 하나의 쿼리 SQL로 결합

분류에서Dev

MySQL 쿼리의 GROUP BY

분류에서Dev

T-SQL을 하위 선택하지 않고 쿼리보기

분류에서Dev

linq ef를 사용하여 t-sql 하위 쿼리 그룹

분류에서Dev

SQL 하위 쿼리 논리

분류에서Dev

Group by 절에서 하위 쿼리를 사용하는 방법 SQL Server 2005

분류에서Dev

mysql의 Group_concat 하위 쿼리에서 선택 쿼리를 사용하는 방법

분류에서Dev

T-SQL 그룹화 기준 및 하위 쿼리

분류에서Dev

SQL 쿼리, 하위 쿼리 빼기 하위 쿼리?

분류에서Dev

하위 쿼리 SQL의 평균 얻기

분류에서Dev

하위 쿼리 문제 / SQL의 조인

분류에서Dev

하위 쿼리 내부의 SQL 순서

분류에서Dev

하위 쿼리 SQL 내부의 INNER JOIN

분류에서Dev

SQL 하위 쿼리의 내부 조인

분류에서Dev

중첩 쿼리, 하위 쿼리 SQL

분류에서Dev

SQL 쿼리의 하위 쿼리 구문 및 논리

분류에서Dev

LINQ 쿼리 식의 하위 쿼리

분류에서Dev

UPDATE 쿼리의 INSERT 하위 쿼리

분류에서Dev

SQL Server 하위 쿼리

분류에서Dev

SQL 하위 쿼리 지원