Sql 基于两个唯一维度返回聚合的查询?
我有以下表格,其中包含SQL Server 2008 R2中的客户和购买数据: 客户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/
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标题
表从联合中移到外部查询中?