将具有聚合函数的查询转换为组

时间:2014-06-11 11:45:56

标签: sql sql-server group-by aggregate-functions

我想要做的是提取客户订购的订单和订单数量。 我能够获得所有数据,但我想要的是根据每个客户独有的TrackingID对其进行分组,因此无论订购了多少商品,每个客户只能获得一行。

我目前的守则是

Select OT.TrackingID As FW_ID
,(  Select
    SUBSTRING(CT.Name, 1, CHARINDEX(' ', CT.Name) - 1)
    Where LEN(CT.Name) - LEN(REPLACE(CT.Name, ' ', '')) > 0
)   As Forename
,(  Select
    SUBSTRING(CT.Name, CHARINDEX(' ', CT.Name) + 1, 8000)
    Where LEN(CT.Name) - LEN(REPLACE(CT.Name, ' ', '')) > 0
)   As Surname
,(  Select CAST(1 as VARCHAR) + ' p1 male'  
Where OT.ArticleNr = 1
And CT.GroupNr IN (2,5)) As Amount_male_t1
,(  Select CAST(1 as VARCHAR) + ' p1 female'  
Where OT.ArticleNr = 2
And CT.GroupNr IN (2,5)) As Amount_female_t1
,(  Select CAST(1 as VARCHAR) + ' p2 male'  
Where OT.ArticleNr = 1
And CT.GroupNr IN (3,6)) As Amount_male_t2
,(  Select CAST(1 as VARCHAR) + ' p2 female'  
Where OT.ArticleNr = 2
And CT.GroupNr IN (3,6)) As Amount_female_t2

From OrderTable As OT
JOIN CustomerTable As CT
    ON OT.CustomerNr = CT.CustomerNr
JOIN CampaignTable As CT
    ON OT.TrackingID = CT.TrackingID
Where CT.GroupNr IN (2,3,5,6)
And OT.NewOrder = 1

我可以从中得到的一个例子是

FW_ID      Forename      Surname      Amount_male_t1      Amount_female_t1      Amount_male_t2      Amount_female_t2
101        John          Doe          1 p1 male           NULL                  NULL                NULL
101        John          Doe          NULL                1 p1 female           NULL                NULL
102        Steve         Boss         NULL                NULL                  1 p2 male           NULL
102        Steve         Boss         NULL                NULL                  1 p2 male           NULL

我想要的是

FW_ID      Forename      Surname      Amount_male_t1      Amount_female_t1      Amount_male_t2      Amount_female_t2
101        John          Doe          1 p1 male           1 p1 female           NULL                NULL
102        Steve         Boss         NULL                NULL                  2 p2 male           NULL

问题是当我在OT.TrackingID上使用Group By时,由于它们已经聚合而在名称上使用MAX()时出现错误,并且在尝试将包计数器转换为COUNT()funktions时出错。 非常感谢帮助。

联接表看起来像这样

OrderTable:

TrackingID      CustomerNr      OrderNr      ArticleNr      NewOrder      OrderDate
101             10054           25           1              1             2014-06-09
101             10054           24           2              1             2014-06-09
102             10036           23           1              1             2014-06-08
102             10036           22           1              1             2014-06-07
103             10044           21           2              0             2014-06-06

CustomerTable的

CustomerNr      Name          Adress        ZipCode      CustomerCreatedDate
10054           John Doe      Upstreet      123456       2013-05-18
10036           Steve Boss    Downstreet    234567       2014-06-07
10044           Eric Cartman  Sidestreet    345678       2014-02-21

CampaignTable

TrackingID      GroupNr      ProductDescription
101             2            Group 2 & 5 are offered package 1
102             3            Group 3 & 6 are offered package 2
103             5            Group 2 & 5 are offered package 1

注意:如果有人可以提出建议,为什么我的问题被低估了,那将是最受欢迎的。我不太清楚我做错了什么。

2 个答案:

答案 0 :(得分:0)

如上所述,一种方法是使用视图。您可以在查询中内联执行此操作,并且不需要将其保存在架构中。

我已经制作了一个demo来说明如何使用您提供的示例表数据来完成此操作。如果您想将数据的表示更改为单行,可以从此处开始,只需按照here显示它。

SELECT SplitNames.Forename, SplitNames.LastName FROM CustomerTable
INNER JOIN
(
  SELECT CustomerNr,
  SUBSTRING(CT.Name, 1, CHARINDEX(' ', CT.Name) - 1) As Forename,
  SUBSTRING(CT.Name, CHARINDEX(' ', CT.Name), LEN(CT.Name) - 1) As LastName
  FROM CustomerTable CT
) SplitNames ON CustomerTable.CustomerNr = SplitNames.CustomerNr

通常,您应该尝试尽可能少地使用select语句中的子查询,因为这样就无法正确汇总任何结果。

答案 1 :(得分:-1)

您可以将查询用作视图,然后使用distinct和count子句将该视图用于新查询。 对不起,我知道这不是最好的解决方案,因为它有两个步骤,可能会以更好的方式解决,但我找不到更好的东西,目前,我的数据库没有任何示例数据。< / p>