2017-02-15 4 views
0

다른 열을 그룹화하는 동안 한 열을 합산하려고합니다. 일관되게 SQL은
두 줄로 구분됩니다.
금액을 합산 동안그룹화 및 집계 SQL

Select A.client, A.store, A.Type as 'Ticket Type', A.[bizdate] as 'DATE',  
sum(cast(round(c.[Amount2],2) as decimal (20,0))) 'QTY', c.SKU, c.[DESC], 
sum(cast(round(c.[Amount1],2)as decimal(20,2))) as 'Total' 


From Mydatabase A inner join mydatabase.dbo.TicketHeader B on A.  
[ticket] = b.[ticket] and a.[yyyymmdd] = b.[yyyymmdd] 
inner join mydatabase.dbo.ticketdetail C on C.[ticketheaderid] = 
b.[id] and c.[class] = a.[class] 

where 
A.Store = @store 
and a.yyyymmdd = @yyyymmdd 
and c.class <> 'balance' 
and c.Subtype <> 'cancelled' 
and a.type NOT IN  
('SKU','Total','CASH','CHANGE','NA','TAX1','TAX2','TAX3','TAX4','CHARGE',  
'Delivery Service', 'Tip') 
and c.[DESC] <> 'NA' 
and c.sku = '300129' 

group by c.sku, c.[DESC],a.store, a.type, a.bizdate, a.client, c.[Amount2],  
c.[Amount1] 
order by [ticket type] 

client, Store TicketType   date  qty SKU Description Amount 
1  2404 CURBSIDE/TO GO 20170214 1 300129 Beef TACO 2.00 
1  2404 DINE IN   20170214 1 300129 Beef TACO 2.00 
1  2404 DINE IN   20170214 2 300129 Beef TACO 4.00 
1  2404 FOODSBY   20170214 2 300129 Beef TACO 4.00 

내가 한 줄에 그룹에 쇠고기 TACO에서 식사를 시도하고있다 : 다음

내 스크립트와 내 결과입니다.

+2

그룹에서 Amount1과 Amount2를 가져옵니다. 당신은 집단으로 그들을 사용하여 귀하의 집합으로, 비생산적입니다. –

+1

왜 왜 날짜를 정수 또는 varchar로 저장하고 있습니까? –

+0

내가 풀어 냈을 때 그룹에 있어야한다고합니다. varchar로 날짜를 저장하는 것은 아마도 내 문제일까요? –

답변

1

몇 가지 디자인 및 코드 문제가 있습니다. Amount1과 Amount2와 같은 것은 정규화가 잘못되었을 가능성을 나타냅니다. 별칭 A, B, C는 유지 관리 방법을 어렵게 만드는 나쁜 습관입니다. http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-table-aliases-like-a-b-c-or-t1-t2-t3.aspx

여러분의 코드는 형식화의 관점에서 다루기가 어렵다는 점에서 엉망입니다. 약간의 공백을 추가하고 그룹화를 위치 시키십시오. 그러면 정상적으로 작동합니다.

Select A.client 
    , A.store 
    , A.Type as 'Ticket Type' 
    , A.[bizdate] as 'DATE' 
    , sum(cast(round(c.[Amount2],2) as decimal (20,0))) 'QTY' 
    , c.SKU 
    , c.[DESC] 
    , sum(cast(round(c.[Amount1],2)as decimal(20,2))) as 'Total' 
From Mydatabase A 
inner join mydatabase.dbo.TicketHeader B on A.[ticket] = b.[ticket] 
             and a.[yyyymmdd] = b.[yyyymmdd] 
inner join mydatabase.dbo.ticketdetail C on C.[ticketheaderid] = b.[id] and c.[class] = a.[class] 
where 
    A.Store = @store 
    and a.yyyymmdd = @yyyymmdd 
    and c.class <> 'balance' 
    and c.Subtype <> 'cancelled' 
    and a.type NOT IN  
    (
     'SKU','Total','CASH','CHANGE','NA','TAX1','TAX2','TAX3','TAX4','CHARGE','Delivery Service', 'Tip' 
    ) 
    and c.[DESC] <> 'NA' 
    and c.sku = '300129' 
group by A.client 
    , A.store 
    , A.Type 
    , A.[bizdate] 
    , c.SKU 
    , c.[DESC] 
order by [ticket type]