2013-12-11 27 views
0

我有一個查詢,我一直在努力整個星期。我仍然對此感到陌生,我很欣賞迄今爲止收到的幫助。排除SQL查看問題

該查詢從3個表中提取數據,將其轉儲到一個視圖中,然後我有第二個查詢以老闆想要的方式格式化數據。麻煩的是,這必須在SAP B1上運行,它似乎不支持視圖。所以我需要在一個查詢中完成所有工作。

這是第一個查詢:

SELECT 
t2.cardcode as 'BP_Code', 
--t0.Recontact as 'Date', 
t2.CardName as 'BP_Name', 
SubString(T3.Name,1,2) as 'Salesman', 
replace(T0.Street,',',' ') as 'Street_Address', 
T0.City, 
T0.State, 
SUM(CASE WHEN YEAR(t0.recontact) = 2011 THEN convert(decimal(10,2),t0.U_sold) ELSE 0 END) AS 'Year2011', 
SUM(CASE WHEN YEAR(t0.recontact) = 2012 THEN convert(decimal(10,2),t0.U_sold) ELSE 0 END) AS 'Year2012', 
SUM(CASE WHEN YEAR(t0.recontact) = 2013 THEN convert(decimal(10,2),t0.U_sold) ELSE 0 END) AS 'Year2013', 
convert(decimal(10,2),SUM(t0.U_sold)) as 'Total_Sold' 
From 
OCLG t0 -- OCLG is Activities 
inner join OCRD t2 -- OCRD is Customer Definitions 
on T0.cardcode like t2.cardcode 
inner join OCLS t3 -- OCLS is Activity Definitions 
on T0.CntctSbjct=T3.Code 
where 
t0.U_sold > 0 
and T0.CntctSbjct=T3.Code 
and T0.CardCode=T2.CardCode 
and T0.CntctType='3' 
and t2.CardCode = 'a239' --This was added to simplify output 
and T0.Recontact >= Convert(date, '2011-01-01') and T0.Recontact <= Convert(date, '2013-12-31') 
group by t2.cardcode, t0.city, t0.state, t0.street, t2.CardName, T3.Name, t0.Recontact 
order by t2.CardCode 

現在,吐出表看起來像這樣:

BP_Code BP_Name  Salesman  Street_Address  City  State  Year2011  Year2012  Year 2013  Total_Sold 
A239 Buddy's 01 123 WASHINGTON WASHINGTON  MO 8993.84 0.00 0.00 8993.84 
A239 Buddy's 01 123 WASHINGTON WASHINGTON  MO 16474.54 0.00 0.00 16474.54 
A239 Buddy's 01 123 WASHINGTON WASHINGTON  MO 0.00 7170.79 0.00 7170.79 
A239 Buddy's 01 123 WASHINGTON WASHINGTON  MO 0.00 9207.73 0.00 9207.73 
A239 Buddy's 01 123 WASHINGTON WASHINGTON  MO 0.00 0.00 6960.20 6960.20 
A239 Buddy's 01 123 WASHINGTON WASHINGTON  MO 0.00 0.00 6787.73 6787.73 

現在我堅持在一個名爲CallReport查看輸出,並運行此它查詢:

;WITH x AS 
(
    SELECT BP_Code, BP_Name, SalesMan, Street_Address, 
    s = SUM(Total_Sold) OVER (PARTITION BY BP_Code), 
    a = SUM(Year2011) OVER (PARTITION BY BP_Code), 
    b = SUM(Year2012) OVER (PARTITION BY BP_Code), 
    c = SUM(Year2013) OVER (PARTITION BY BP_Code), 
    r = ROW_NUMBER() OVER (PARTITION BY BP_Code ORDER BY Date DESC) 
    FROM CallReport 
) 
SELECT BP_Code, BP_Name, Salesman, Street_Address, Year2011 = a, Year2012 = b, Year2013 = c, Total_Sold = s 

    FROM x 
    WHERE r = 1 and Salesman = 01; 

然後我得到我想要的輸出:

BP_Code BP_Name Salesman Street_Address Year2011 Year2012 Year2013 Total_Sold 
A239 Buddy's 01 123 WASHINGTON 25468.38 16378.52 13747.93 106804.83 

看看問題是什麼?我有數百個BP_Codes,我只是縮小了A239的範例。我需要每個BP_code只在一行上,每年的總銷售額數據和總計。我知道有一種方法可以更容易地做到這一點,但我對這款遊戲仍然很陌生。有任何想法嗎?這是MSSQL 2008 R2

回答

0

如果我理解這一點正確你企圖修改視圖,以獲得所需的輸出,下面是它

SELECT 
t2.cardcode as 'BP_Code', 
--t0.Recontact as 'Date', 
t2.CardName as 'BP_Name', 
SubString(T3.Name,1,2) as 'Salesman', 
replace(T0.Street,',',' ') as 'Street_Address', 
T0.City, 
T0.State, 
SUM(CASE WHEN YEAR(t0.recontact) = 2011 THEN convert(decimal(10,2),t0.U_sold) ELSE 0 END) AS 'Year2011', 
SUM(CASE WHEN YEAR(t0.recontact) = 2012 THEN convert(decimal(10,2),t0.U_sold) ELSE 0 END) AS 'Year2012', 
SUM(CASE WHEN YEAR(t0.recontact) = 2013 THEN convert(decimal(10,2),t0.U_sold) ELSE 0 END) AS 'Year2013', 
convert(decimal(10,2),SUM(t0.U_sold)) as 'Total_Sold' 
From 
OCLG t0 -- OCLG is Activities 
inner join OCRD t2 -- OCRD is Customer Definitions 
on T0.cardcode like t2.cardcode 
inner join OCLS t3 -- OCLS is Activity Definitions 
on T0.CntctSbjct=T3.Code 
where 
t0.U_sold > 0 
and T0.CntctSbjct=T3.Code 
and T0.CardCode=T2.CardCode 
and T0.CntctType='3' 
and t2.CardCode = 'a239' --This was added to simplify output 
and T0.Recontact >= Convert(date, '2011-01-01') and T0.Recontact <= Convert(date, '2013-12-31') 
group by t2.cardcode, t0.city, t0.state, replace(T0.Street,',',' '), t2.CardName, SubString(T3.Name,1,2) 
order by t2.CardCode 

我所做的代碼是糾正你的GROUPBY子句,由於t0,你得到了多個記錄。

如果您在t0.city,t0.state中有多個值,請替換BP_Code的(T0.Street,',',''),t2.CardName,SubString(T3.Name,1,2)列你想選擇這些列的值之一,然後使用下面的代碼

SELECT 
t2.cardcode as 'BP_Code', 
--t0.Recontact as 'Date', 
max(t2.CardName) as 'BP_Name', 
max(SubString(T3.Name,1,2)) as 'Salesman', 
max(replace(T0.Street,',',' ')) as 'Street_Address', 
max(T0.City) City, 
max(T0.State) State, 
SUM(CASE WHEN YEAR(t0.recontact) = 2011 THEN convert(decimal(10,2),t0.U_sold) ELSE 0 END) AS 'Year2011', 
SUM(CASE WHEN YEAR(t0.recontact) = 2012 THEN convert(decimal(10,2),t0.U_sold) ELSE 0 END) AS 'Year2012', 
SUM(CASE WHEN YEAR(t0.recontact) = 2013 THEN convert(decimal(10,2),t0.U_sold) ELSE 0 END) AS 'Year2013', 
convert(decimal(10,2),SUM(t0.U_sold)) as 'Total_Sold' 
From 
OCLG t0 -- OCLG is Activities 
inner join OCRD t2 -- OCRD is Customer Definitions 
on T0.cardcode like t2.cardcode 
inner join OCLS t3 -- OCLS is Activity Definitions 
on T0.CntctSbjct=T3.Code 
where 
t0.U_sold > 0 
and T0.CntctSbjct=T3.Code 
and T0.CardCode=T2.CardCode 
and T0.CntctType='3' 
and t2.CardCode = 'a239' --This was added to simplify output 
and T0.Recontact >= Convert(date, '2011-01-01') and T0.Recontact <= Convert(date, '2013-12-31') 
group by t2.cardcode 
order by t2.CardCode 
+0

你是我的英雄!第一個幾乎可以工作(我不敢相信我太親近了......),除非地址有所不同。第二個完美的工作! – user3059028

+0

很高興它工作:) – sam