我想要做的是提取客户订购的订单和订单数量。 我能够获得所有数据,但我想要的是根据每个客户独有的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
注意:如果有人可以提出建议,为什么我的问题被低估了,那将是最受欢迎的。我不太清楚我做错了什么。
答案 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>