2014-11-06 24 views
0

Ive得到通過幾個月計算數量和值,然後將它們放入24列下面的SQL查詢,以便將數據看起來是這樣的:鏈接不同的表到一個SQL查詢

Jan , JanQty, Feb , FebQTY, Mar , MarQty 
1285, 35 , 3228 , 36 , 1750, 18  

但現在我要添加在這樣的業務合作伙伴領域(OINV &王林)和項目(INV1 & RIN1),這樣的數據有去從不同的表下的項目/商業夥伴更行,所以它看起來是這樣的:

Business Partner, Items , Jan, JanQty, Feb , FebQTY, Mar, MarQty 
SAP Ltd   , Software, 150, 1  , 0 , 0  , 500, 2 
SAP Ltd   , Phones , 175, 4  , 145 , 1  , 100, 1 
SAP Ltd   , Tablets , 10 , 9  , 86 , 8  , 400, 3 
JPC Ltd   , Software, 350, 7  , 999 , 9  , 250, 4 
JPC Ltd   , PC's , 350, 7  , 999 , 9  , 250, 4 
JPC Ltd   , Software, 350, 7  , 999 , 9  , 250, 4 

我用盡許多不同的方式,但約沒有得到它的工作,任何幫助將是偉大的。

下面是我的查詢

SELECT 
     Jan, 
     JanQty, 
     Feb, 
     FebQty 
     Mar, 
     MarQty, 
     Apr, 
     AprQty, 
     May, 
     MayQty, 
     June, 
     JuneQty, 
     July, 
     JulyQty, 
     Aug, 
     AugQty, 
     Sept, 
     SeptQty, 
     Oct, 
     OctQty, 
     Nov, 
     NovQty, 
     Dec, 
     DecQty 
    FROM 
     (
     SELECT 
      SUM(JanQty) as 'JanQty', 
      SUM(FebQty) as 'FebQty', 
      SUM(MarQty) as 'MarQty', 
      SUM(AprQty) as 'AprQty', 
      SUM(MayQty) as 'MayQty', 
      SUM(JuneQty) as 'JuneQty', 
      SUM(JulyQty) as 'JulyQty', 
      SUM(AugQty) as 'AugQty', 
      SUM(SeptQty) as 'SeptQty', 
      SUM(OctQty) as 'OctQty', 
      SUM(NovQty) as 'NovQty', 
      SUM(DecQty) as 'DecQty' 
     FROM 
      (
      SELECT 
       ISNULL([1],0) as JanQty, 
       ISNULL([2],0) as FebQty, 
       ISNULL([3],0) as MarQty, 
       ISNULL([4],0) as AprQty, 
       ISNULL([5],0) as MayQty, 
       ISNULL([6],0) as JuneQty, 
       ISNULL([7],0) as JulyQty, 
       ISNULL([8],0) as AugQty, 
       ISNULL([9],0) as SeptQty, 
       ISNULL([10],0) as OctQty, 
       ISNULL([11],0) as NovQty, 
       ISNULL([12],0) as DecQty 
      FROM 
       (
       SELECT 
        SUM(T0.Quantity) as QtyBal, 
        MONTH(T1.DocDate) as Month 
       FROM 
        INV1 T0 
        inner join 
        OINV T1 on t0.DocEntry = t1.DocEntry 
       WHERE 
        t1.DocDate BETWEEN '20140101' AND '20141231' and 
        year(T1.DocDate) = 2014 
       GROUP BY t0.Quantity, t1.DocDate 
      ) s 

       PIVOT 
        (
        SUM(QtyBal) FOR 
        Month IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]) 
       ) p 

       UNION ALL 

       SELECT 
        ISNULL([1],0) as JanQty, 
        ISNULL([2],0) as FebQty, 
        ISNULL([3],0) as MarQty, 
        ISNULL([4],0) as AprQty, 
        ISNULL([5],0) as MayQty, 
        ISNULL([6],0) as JuneQty, 
        ISNULL([7],0) as JulyQty, 
        ISNULL([8],0) as AugQty, 
        ISNULL([9],0) as SeptQty, 
        ISNULL([10],0) as OctQty, 
        ISNULL([11],0) as NovQty, 
        ISNULL([12],0) as DecQty 
       from 
        (
        select 
         SUM((case when T0.NoInvtryMv = 'Y' then t0.Quantity else -t0.Quantity end)) as QtyBal, 
         MONTH(T1.DocDate) as Month 
        from 
         RIN1 T0 
         inner join 
         ORIN T1 on t0.DocEntry = t1.DocEntry 
        where 
         t1.DocDate BETWEEN '20140101' AND '20141231' and 
         year(T1.DocDate) = 2014 
        group by t1.DocDate) s 

        Pivot 
         (
         SUM(QtyBal) FOR 
         Month IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]) 
        ) p 
      ) sqa 
     ) qty 
      CROSS JOIN 
      (
      SELECT 
       SUM(Jan) as 'Jan', 
       SUM(Feb) as 'Feb', 
       SUM(Mar) as 'Mar', 
       SUM(Apr) as 'Apr', 
       SUM(May) as 'May', 
       SUM(June) as 'June', 
       SUM(July) as 'July', 
       SUM(Aug) as 'Aug', 
       SUM(Sept) as 'Sept', 
       SUM(oct) as 'Oct', 
       SUM(nov) as 'Nov', 
       SUM(Dec) as 'Dec' 
      FROM 
       (
       SELECT 
        ISNULL([1],0) as Jan, 
        ISNULL([2],0) as Feb, 
        ISNULL([3],0) as Mar, 
        ISNULL([4],0) as Apr, 
        ISNULL([5],0) as May, 
        ISNULL([6],0) as June, 
        ISNULL([7],0) as July, 
        ISNULL([8],0) as Aug, 
        ISNULL([9],0) as Sept, 
        ISNULL([10],0) as Oct, 
        ISNULL([11],0) as Nov, 
        ISNULL([12],0) as Dec 
       FROM 
        (
        SELECT 
         SUM(T0.LineTotal) as Bal, 
         MONTH(T1.DocDate) as Month 
        FROM 
         INV1 T0 
         inner join 
         OINV T1 on t0.DocEntry = t1.DocEntry 
        WHERE 
         t1.DocDate BETWEEN '20140101' AND '20141231' and 
         year(T1.DocDate) = 2014 
        GROUP BY t0.LineTotal, t1.DocDate 
       ) s 

       PIVOT 
        (
        SUM(Bal) FOR 
        Month IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]) 
       ) p 

       UNION ALL 

       SELECT 
        ISNULL([1],0) as Jan, 
        ISNULL([2],0) as Feb, 
        ISNULL([3],0) as Mar, 
        ISNULL([4],0) as Apr, 
        ISNULL([5],0) as May, 
        ISNULL([6],0) as June, 
        ISNULL([7],0) as July, 
        ISNULL([8],0) as Aug, 
        ISNULL([9],0) as Sept, 
        ISNULL([10],0) as Oct, 
        ISNULL([11],0) as Nov, 
        ISNULL([12],0) as Dec 
       from 
        (
        select 
         SUM(-T0.LineTotal) as Bal, 
         MONTH(T1.DocDate) as Month 
        from 
         RIN1 T0 
         inner join 
         ORIN T1 on t0.DocEntry = t1.DocEntry 
        where 
         t1.DocDate BETWEEN '20140101' AND '20141231' and 
         year(T1.DocDate) = 2014 
        group by -t0.LineTotal, t1.DocDate 
       ) s 

       Pivot 
        (
        SUM(Bal) FOR 
        Month IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12]) 
       ) p 
      ) sqb 
     ) Bal 

回答

1

我假設了2名額外的字段已經在您的基表的一部分?在這種情況下,您可以在嵌套查詢的最低級別將它們作爲一個組添加,例如,

SELECT    Business_Partner, 
        Items, 
        ISNULL([1],0) as Jan, 
        ISNULL([2],0) as Feb, 
        ISNULL([3],0) as Mar, 

流動該組到您的數據透視位置。然後,將新字段作爲非透視列添加。

這件事情是這樣的:

SELECT 
      Business_Partner, 
      Items, 
      ISNULL([1],0) as JanQty, 
      ISNULL([2],0) as FebQty, 
      ISNULL([3],0) as MarQty 
      FROM 
      (SELECT 
       Business_Partner, 
       Items, 
       SUM(T0.Quantity) as QtyBal, 
       MONTH(T1.DocDate) as Month 
      FROM 
       INV1 T0 
       inner join 
       OINV T1 on t0.DocEntry = t1.DocEntry 
      WHERE 
       t1.DocDate BETWEEN '20140101' AND '20141231' and 
       year(T1.DocDate) = 2014 
      GROUP BY t0.Quantity, t1.DocDate) 
+0

是的,該字段來自基表。我需要添加的字段是:T1.Cardname,T0.ItemCode 我已經在查詢的一小部分進行了上述更改只是爲了測試,但我只是得到錯誤「多部分標識符」FEILD NAME「可能不受限制「 – JColborne12 2014-11-06 16:23:03

+0

我沒有在您提供的代碼中看到Feild名稱。這個錯誤聽起來像是你的選擇中有一個連接或某些東西不存在,例如這是一個錯字,你想'場名'?另外,我建議運行更小的代碼塊,以確保它們能夠正常工作,然後擴展您運行的位。這將更容易查明錯誤。 – user3302483 2014-11-06 17:08:06

0

在未來它會更容易回答,如果你提供一些測試數據,你正在使用的架構。

就這樣說,下面是我如何去做的一個例子。如果你從多個表中提取數據,那麼我建議從各個表中提取你需要的數據,然後在獲取所有數據的查詢周圍包裝一個類似於下面的選擇。如果可能的話,我會避免使用pivoting,因爲如果您已經知道會有靜態列(在這種情況下爲monthamount/monthquantity),我認爲它太複雜了。

CREATE TABLE #Test 
(
    BusinessPartner VARCHAR(15), 
    Item VARCHAR(25), 
    Price INT, 
    [MONTH] int 
) 

INSERT INTO #Test 
SELECT 'SAP', 'Software', 44, 1 
UNION 
SELECT 'SAP', 'Software', 51, 1 
UNION 
SELECT 'SAP', 'Software', 115, 2 
UNION 
SELECT 'SAP', 'Phones', 11, 1 
UNION 
SELECT 'JDC', 'Software', 21, 1 
UNION 
SELECT 'JDC', 'Software', 21345, 2 
UNION 
SELECT 'JDC', 'Software', 2346, 2 
UNION 
SELECT 'JDC', 'Phones', 1123, 1 
UNION 
SELECT 'JDC', 'Phones', 5415, 1 

SELECT BusinessPartner, 
    Item, 
    Jan = SUM(CASE WHEN MONTH = 1 THEN Price ELSE 0 END), 
    JanQty = SUM(CASE WHEN MONTH = 1 THEN 1 ELSE 0 END), 
    Feb = SUM(CASE WHEN MONTH = 2 THEN Price ELSE 0 END), 
    FebQty = SUM(CASE WHEN MONTH = 2 THEN 1 ELSE 0 END) 
    FROM #Test 
    GROUP BY BusinessPartner, Item 
    ORDER BY BusinessPartner, Item