【问题标题】:SQL Server SQL JOIN AssistanceSQL Server SQL JOIN 协助
【发布时间】:2010-10-05 16:03:06
【问题描述】:

我的连接不正确,并且还没有找到正确的方法来获取我需要的数据,因为下面的 3 个表(客户、SalesHeader、SalesDetail)我正在尝试获取每行有 1 个客户的行项目以及 GL Acct 4000 中的所有销售明细和 GL Acct 5000 中的所有销售交易的总和。还有更多列,以及我想添加的其他几个 GL 帐户,但我已将其分解为最简单的形式试着让它工作。我在下面提供了模拟数据以及我未能成功处理的 SQL 语句的最新版本。如果有人可以帮助我找出我在此 SQL Select 语句中做错了什么,将不胜感激。

客户

CustID | CustCode
------------------
1      | AAA111
2      | AN8348

SalesHeader

SH_ID |  SH_CustID  | SH_GLACCT
-------------------------------
1     |  1          | 4000
2     |  1          | 5000
3     |  1          | 4000
4     |  2          | 5000

销售详情

SD_ID | SD_HID  | Price
--------------------------
1     | 1       | 100.00
2     | 1       | 540.00
3     | 2       | 100.00
4     | 3       | 600.00
5     | 4       | 50.00
6     | 4       | 75.00

所需的输出

地毯 = 4000 垫 = 5000

CustID | CustCode    | Carpet (Sum all SH_GLACCT = 4000) | PAD (Sum all SH_GLACCT = 5000)
-------------------------------------------------------------------------------------------
1      | AAA111      | 1240.00                           | 100.00
2      | AN8348      | 0.00                              | 125.00

不正确的 SQL(两个金额都超过了应有的值)

SELECT C.CustID, C.CustCode, SUM(ADH.Price) AS Carpet, SUM(APD.Price) As Pad
FROM Customer AS C

LEFT OUTER JOIN SalesHeader AS ACH On C.CustID = ACH.SH_CustID AND ACH.SH_GLACCT = '4000'
LEFT OUTER JOIN SalesDetail AS ADH On ACH.SH_ID = ADH.SD_HID


LEFT OUTER JOIN SalesHeader AS APH On C.CustID = APH.SH_CustID AND APH.SH_GLACCT = '5000'
LEFT OUTER JOIN SalesDetail AS APD On APH.SH_ID = APD.SD_HID


GROUP BY C.CustID, C.CustCode

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    试试这个:

       Select c.CustId, c.CustCode
           Sum(Case When h.SH_GLACCT = 4000 Then Price End) Acct4000Total,
           Sum(Case When h.SH_GLACCT = 5000 Then Price End) Acct5000Total
       From Customer c
          Join Salesheader h On h.SH_CustID = c.CustID
          Join SalesDetail d On d.SD_HID = h.SH_ID
       Where h.SH_GLACCT In (4000, 5000)
       Group By c.CustId  
    

    如果您想列出没有销售的客户,请使用外连接:

       Select c.CustId, c.CustCode
           Sum(Case When h.SH_GLACCT = 4000 Then Price End) Acct4000Total,
           Sum(Case When h.SH_GLACCT = 5000 Then Price End) Acct5000Total
       From Customer c
          Left Join (Salesheader h Join SalesDetail d 
                       On d.SD_HID = h.SH_ID
                           And h.SH_GLACCT In (4000, 5000))
              On h.SH_CustID = c.CustID
       Group By c.CustId  
    

    【讨论】:

      【解决方案2】:

      尝试以下方法:

      SELECT  c.CustID
          ,   c.CustCode
          ,   Carpet  = SUM(CASE WHEN sh.SH_GLACCT = 4000 THEN sd.Price ELSE 0 END)
          ,   Pad     = SUM(CASE WHEN sh.SH_GLACCT = 5000 THEN sd.Price ELSE 0 END)
      FROM    Customer c
          LEFT JOIN
              SalesHeader sh
          ON c.CustID = sh.CustID
      
          LEFT JOIN 
              SalesDetail sd
          ON  sh.sh_id = sd.sd_hid
      GROUP   BY
              c.CustID
          ,   c.CustCode
      

      【讨论】:

        【解决方案3】:

        您可以为此使用 PIVOT 运算符:

        SELECT CustID, CustCode, SUM([4000]) Carpet, SUM([5000]) PAD
        FROM Cust c
        JOIN SalesHeader sh ON c.CustID = sh.SH_CustID
        JOIN SalesDetail sd ON sh.SH_ID = sd.SD_HID
        PIVOT (
            SUM(sd.Price)
            FOR sh.SH_GLACCT IN ([4000],[5000])
        ) AS pt
        GROUP BY CustID, CustCode
        

        【讨论】:

          【解决方案4】:
          SELECT C.CustID, C.CustCode, SH_GLACCT, SUM(Price) AS sum_price
          FROM Customer  C
          INNER JOIN SalesHeader sh On C.CustID = sH.SH_CustID 
          LEFT OUTER JOIN SalesDetail sd On sh.SH_ID = sd.SD_HID
          
          WHERE
          SH_GLACCT in(4000,5000)
          
          GROUP BY CustID, CustCode, SH_GLACCT
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-01-02
            相关资源
            最近更新 更多