Sql server SQL Server:计算ProductID以获取销售总次数
我对一个似乎很简单的问题感到困惑。我试图通过对Sql server SQL Server:计算ProductID以获取销售总次数,sql-server,count,Sql Server,Count,我对一个似乎很简单的问题感到困惑。我试图通过对ProductID进行计数和分组来获得整个产品的销售次数。我在网上对它进行了研究,无论我走到哪里,它都只是添加了一个简单的计数,但当我这样做时,它仍然输出相同数量的行 因此,如果我不使用COUNT(例如),它会输出1000行,如果我使用COUNT它会输出1000行,并且不会给出正确的销售时间。它们都列为“1”,不进行分组和计数。我猜这和我的连接有关,但我想不出来 下面是我在使用COUNT后看到的示例(我删除了brand和date_添加的内容,只是为了
ProductID
进行计数和分组来获得整个产品的销售次数。我在网上对它进行了研究,无论我走到哪里,它都只是添加了一个简单的计数
,但当我这样做时,它仍然输出相同数量的行
因此,如果我不使用COUNT
(例如),它会输出1000行,如果我使用COUNT
它会输出1000行,并且不会给出正确的销售时间。它们都列为“1”,不进行分组和计数。我猜这和我的连接有关,但我想不出来
下面是我在使用COUNT后看到的示例(我删除了brand和date_添加的内容,只是为了便于阅读)。ProductID显示不止一次,即使它们应该分组并计数
times_sold | ProductID | title
---------- | --------- | ---------
1 | 17998 | title 2
1 | 13670 | title 3
1 | 17956 | title 4
1 | 4569 | title 5
1 | 12598 | title 1
1 | 12598 | title 1
1 | 17998 | title 2
下面是我正在运行的查询:
SELECT TOP (100) PERCENT
COUNT(s.ProductID) AS times_sold,
s.ProductID, p.title, p.brandname, p.date_added
FROM
dbo.TBL_OrderSummary AS s
INNER JOIN
dbo.jewelry AS p ON s.ProductID = p.ProductID
INNER JOIN
dbo.sent_items AS i ON s.InvoiceID = i.ID
GROUP BY
s.ProductID, p.title, p.brandname, p.flare_type, p.date_added,
i.date_order_placed, i.ship_code, p.jewelry
HAVING
(p.title LIKE '%stone%')
AND (i.date_order_placed > CONVERT(DATETIME, '2016-01-01 00:00:00', 102))
AND (i.ship_code = N'paid')
AND (p.flare_type = 'Single flare')
AND (p.jewelry LIKE '%plugs%')
谢谢你的帮助 它们看起来不正确的原因是因为行中的所有记录都不相同。如果您有一个产品名称小部件2,年份为2015年,而您有另一个产品名称小部件,年份为2016年,则每个产品旁边只计算1,因为整行只显示一次。您需要将您的组限制为,以获得准确的计数
GROUP BY s.productID, p.title, COUNT(s.productID)
这会给你一个准确的数字。您只是将您的组限制在太大的样本范围内,无法获得任何唯一的记录。您必须减少选择中的内容,才能使其生效。您需要在选择中包含s.Product和p.title,以便与组匹配。希望这能有所帮助。它们看起来不正确的原因是因为行中的所有记录都不相同。如果您有一个产品名称小部件2,年份为2015年,而您有另一个产品名称小部件,年份为2016年,则每个产品旁边只计算1,因为整行只显示一次。您需要将您的组限制为,以获得准确的计数
GROUP BY s.productID, p.title, COUNT(s.productID)
这会给你一个准确的数字。您只是将您的组限制在太大的样本范围内,无法获得任何唯一的记录。您必须减少选择中的内容,才能使其生效。您需要在选择中包含s.Product和p.title,以便与组匹配。希望这有帮助。除非您是通过聚合函数进行筛选(即
HAVING COUNT(s.ProductID)>2
),否则您可以将所有选择条件移动到WHERE
行
所以你可以试试:
select count(s.ProductID) times_sold, s.ProductID, p.title
from dbo.TBL_OrderSummary s inner join dbo.jewelry p on s.ProductID = p.ProductID
inner join dbo.sent_items i on s.InvoiceID = i.ID
where p.title like '%stone%'
and i.date_order_placed > CONVERT(DATETIME, '2016-01-01 00:00:00', 102)
and i.ship_code = N'paid'
and p.flare_type = 'Single flare'
and p.jewelry like '%plugs%'
group by s.ProductID, p.title
除非您是通过聚合函数进行筛选(即,
具有COUNT(s.ProductID)>2
),否则您可以将所有选择条件移动到WHERE
行
所以你可以试试:
select count(s.ProductID) times_sold, s.ProductID, p.title
from dbo.TBL_OrderSummary s inner join dbo.jewelry p on s.ProductID = p.ProductID
inner join dbo.sent_items i on s.InvoiceID = i.ID
where p.title like '%stone%'
and i.date_order_placed > CONVERT(DATETIME, '2016-01-01 00:00:00', 102)
and i.ship_code = N'paid'
and p.flare_type = 'Single flare'
and p.jewelry like '%plugs%'
group by s.ProductID, p.title
目前还不完全清楚您对输出的期望,但我觉得您的分组很可疑。我认为您不想按已发送项中的任何值进行分组。你只想按组成你要计数的组的列进行分组。这里不完全清楚你期望的输出是什么,但我觉得你的分组方式很可疑。我认为您不想按已发送项中的任何值进行分组。您只想按组成要计数的组的列进行分组。谢谢!关于记录如何匹配的解释帮助我移动东西并获得所需的数据。再次感谢您的回答:)谢谢!关于记录如何匹配的解释帮助我移动东西并获得所需的数据。再次感谢您的回答:)