Sql 基于两个唯一维度返回聚合的查询?

Sql 基于两个唯一维度返回聚合的查询?,sql,sql-server,sql-server-2008,tsql,aggregate,Sql,Sql Server,Sql Server 2008,Tsql,Aggregate,我有以下表格,其中包含SQL Server 2008 R2中的客户和购买数据: 客户 CustId Last First Phone 1 Doe John 555-5555 2 Smith Sally 444-4444 3 Smith Greg 222-1212 OrderId CustId Date 1001 3 07/08/2011 1002 2 07/

我有以下表格,其中包含SQL Server 2008 R2中的客户和购买数据:

客户

CustId   Last    First    Phone
   1     Doe     John    555-5555  
   2     Smith   Sally   444-4444
   3     Smith   Greg    222-1212
OrderId  CustId  Date  
 1001       3   07/08/2011
 1002       2   07/19/2011
 1003       2   03/12/2012
 1004       1   03/14/2012
 1005       3   03/20/2012
 1006       1   04/17/2012
 1007       2   06/04/2012
 1008       1   08/04/2011
OrderId     Sequence    Item      Type    Manufacturer   Price
 1001          1        WIDGET     C         WidgCo      12.00
 1001          2        SWITCH     C        SwitchCo     10.00
 1002          1        RADIO      A        RadSupply    30.00
 1002          2        CRT        A        CRT&More     31.00
 1002          3        NCARD      G        iNetwork      5.00
 1003          1        SENSOR     E        Sensora       7.50
 1004          1        SENSOR     D        Sensora       6.00
 1005          1        WIDGET     C         WidgInc     11.50
 1006          1        RADIO      A        RadSupply    30.00
 1006          2        SCREEN     A        ScreensInc    2.00
 1007          1        ANTENNA    G       AntennasPlus   5.50
 1008          1        SWITCH     B       SwitchOutlet   6.00
订单头

CustId   Last    First    Phone
   1     Doe     John    555-5555  
   2     Smith   Sally   444-4444
   3     Smith   Greg    222-1212
OrderId  CustId  Date  
 1001       3   07/08/2011
 1002       2   07/19/2011
 1003       2   03/12/2012
 1004       1   03/14/2012
 1005       3   03/20/2012
 1006       1   04/17/2012
 1007       2   06/04/2012
 1008       1   08/04/2011
OrderId     Sequence    Item      Type    Manufacturer   Price
 1001          1        WIDGET     C         WidgCo      12.00
 1001          2        SWITCH     C        SwitchCo     10.00
 1002          1        RADIO      A        RadSupply    30.00
 1002          2        CRT        A        CRT&More     31.00
 1002          3        NCARD      G        iNetwork      5.00
 1003          1        SENSOR     E        Sensora       7.50
 1004          1        SENSOR     D        Sensora       6.00
 1005          1        WIDGET     C         WidgInc     11.50
 1006          1        RADIO      A        RadSupply    30.00
 1006          2        SCREEN     A        ScreensInc    2.00
 1007          1        ANTENNA    G       AntennasPlus   5.50
 1008          1        SWITCH     B       SwitchOutlet   6.00
订单行

CustId   Last    First    Phone
   1     Doe     John    555-5555  
   2     Smith   Sally   444-4444
   3     Smith   Greg    222-1212
OrderId  CustId  Date  
 1001       3   07/08/2011
 1002       2   07/19/2011
 1003       2   03/12/2012
 1004       1   03/14/2012
 1005       3   03/20/2012
 1006       1   04/17/2012
 1007       2   06/04/2012
 1008       1   08/04/2011
OrderId     Sequence    Item      Type    Manufacturer   Price
 1001          1        WIDGET     C         WidgCo      12.00
 1001          2        SWITCH     C        SwitchCo     10.00
 1002          1        RADIO      A        RadSupply    30.00
 1002          2        CRT        A        CRT&More     31.00
 1002          3        NCARD      G        iNetwork      5.00
 1003          1        SENSOR     E        Sensora       7.50
 1004          1        SENSOR     D        Sensora       6.00
 1005          1        WIDGET     C         WidgInc     11.50
 1006          1        RADIO      A        RadSupply    30.00
 1006          2        SCREEN     A        ScreensInc    2.00
 1007          1        ANTENNA    G       AntennasPlus   5.50
 1008          1        SWITCH     B       SwitchOutlet   6.00
我试图创建一个查询,列出每个客户、他们的联系信息、他们在每种类型上的花费总额以及他们与每个制造商的花费总额。到目前为止,我已经尝试了各种不同的连接,但似乎无法使其工作。
我希望返回类似这样的内容:

CustomerId  Last  First  Phone     TYPE  TOT_TYPE  
   1        Doe   John  555-5555    A      32.00
   1        Doe   John  555-5555    B      6.00  
   1        Doe   John  555-5555    D      6.00    

我也不确定如何合并制造商总数。如何在同一个查询中返回两个数据集?

为什么要对其进行否决?这是对这个问题的正确回答。这个问题似乎希望将类型和制造商放在不同的行上(它没有明确说明这一点,但这是一个合理的解释)。不加评论的否决绝对是不礼貌的

你需要与工会合作。一个提示是,您的最终输出不符合您的问题。你没有制造商的位置

select CustomerId, Last, First, Phone,
       Type, Manufacturer, TotPrice
from Customers C join
     ((select customerId, Type, NULL as Manufacturer, sum(Price) as TotPrice,
       from Order_Header oh join
            Order o
            on oh.OrderId = o.OrderId
       group by  customerId, Type
      ) union all
      ((select customerId, NULL as Type, Manufacturer, sum(Price) as TotPrice,
       from Order_Header oh join
            Order o
            on oh.OrderId = o.OrderId
       group by  customerId, Manufacturer
      )
     ) s
     on s.CustomerId = s.CustomerId

听起来好像你想收集数据。这可以得到每个
类型的总计,然后是制造商的总计。有两种方法可以旋转,一种是静态的,另一种是动态的

静态(见)

动态轴(请参见)


两者应提供相同的结果。不同之处在于,静态版本必须硬编码所需的值。动态版本在运行时获取列的值,因此如果制造商更改,它将自动调整

为什么需要它们位于同一数据集中?他们回答了两个完全不同的问题,因此以任何方式将它们结合起来都没有意义。如果可以将这些类型混合在一起,并且您希望类型列为TYPE/MANUFACTURER,那么就很容易了。如果需要将类型列在列中,以便将每个客户的所有内容都放在一行中,那么就需要一个透视

SELECT
   C.DesiredColumns,
   P.Category,
   P.Item
   P.TotalPrice
FROM
   dbo.Customers C
   INNER JOIN (
      SELECT
         H.CustomerId,
         V.Category,
         V.Item,
         Sum(L.Price) TotalPrice
      FROM
         dbo.Order_Header H
         INNER JOIN dbo.Order_Lines L
            ON H.OrderId = L.OrderId
         CROSS APPLY (
            VALUES
               ('Type', [Type]),
               ('Mfr', Manufacturer)
         ) V (Category, Item)
      GROUP BY
         H.CustomerId
         V.Category,
         V.Item
   ) P ON C.CustomerId = P.CustomerId
如果你想要一个支点,使用@BlueFoots的解决方案。否则,你可以考虑这个或戈登的版本。我认为这可能会表现更好,但测试是有序的

SELECT
   C.DesiredColumns,
   P.Category,
   P.Item
   P.TotalPrice
FROM
   dbo.Customers C
   INNER JOIN (
      SELECT
         H.CustomerId,
         V.Category,
         V.Item,
         Sum(L.Price) TotalPrice
      FROM
         dbo.Order_Header H
         INNER JOIN dbo.Order_Lines L
            ON H.OrderId = L.OrderId
         CROSS APPLY (
            VALUES
               ('Type', [Type]),
               ('Mfr', Manufacturer)
         ) V (Category, Item)
      GROUP BY
         H.CustomerId
         V.Category,
         V.Item
   ) P ON C.CustomerId = P.CustomerId

. . 听起来根本不像这个问题需要一个支点。结果在单独的行中,而不是在单独的列中。@GordonLinoff用户需要澄清他们想要什么。用户非常清楚。结果在三个不同的行上重复客户id。这不是一个支点。@GordonLinoff你看过代码了吗?他们确实会得到多行结果,每种类型一行,然后每个制造商一行。给出的示例只有一列表示总价,每种类型有不同的行。这似乎合乎逻辑地适用于其他领域。对我来说,这很清楚,但是由@TelJanni决定他/她真正想要什么。你能澄清你需要的结果吗?为什么你需要它们在同一个数据集中?他们在回答两个完全不同的问题?如果可以将这些类型混合在一起,并且您希望类型列为TYPE/MANUFACTURER,那么就很容易了。如果您需要将类型放在列中,以便将每个客户的所有内容都放在一行中,那么就需要一个数据透视。@ErikE是这样的。我意识到最好是用两个单独的问题回答两个单独的问题。令人惊讶的是,我的老板居然听了并同意了!再次感谢!很遗憾,我不能选择一条评论作为最佳答案。@TelJanini我更新了我的答案(您已经选择了该答案)以包含该评论。所以问题解决了!谢谢有人能解释一下为什么这被否决了吗?虽然可能存在语法错误,但它正确地回答了问题。可能的改进:将
Order\u标题
表从联合中移到外部查询中?