我有一个非标准化的客户订单表。我想要计算出售的产品数量,并按类型在表格中显示。
OnlineSalesKey SalesOrderNumber ProductKey
--------------------------------------------
1 20121018 778
2 20121018 774
3 20121018 665
4 20121019 772
5 20121019 778
9 20121019 434
10 20121019 956
11 20121020 772
12 20121020 965
15 20121020 665
16 20121020 778
17 20121021 665
我的查询:
SELECT
s.ProductKey, COUNT (*) As Purchased
FROM
Sales s
GROUP BY
s.ProductKey
问题#1。
该查询完成了一项工作。但现在我想要显示并仅考虑购买了多个商品的订单。不知道我如何在一个查询中这样做。有什么想法吗?
问题#2
是否可以规范化结果并获取由半列分隔的数据?
20121018 | 778; 774; 665
谢谢!
答案 0 :(得分:4)
您没有说明您正在使用哪个SQL数据库,并且每个数据库都会有不同的,或多或少有效的答案。 (对不起,只是注意到MSSQL在问题标题中。)
这是一个适用于所有或大多数数据库的解决方案:
SELECT s.ProductKey, COUNT (*) As Purchased
FROM Sales s
WHERE SalesOrderNum IN
(SELECT SalesOrderNum FROM Sales GROUP BY SalesOrderNum HAVING COUNT(*) > 1)
GROUP BY s.ProductKey
这不是大多数效率,但应该适用于大多数产品。
另外,请注意您正在反向使用标准化和非标准化术语。您拥有的表格已标准化,您想要的结果将被去标准化。
没有标准的SQL语句可以单独使用SQL来获取所需的非规范化结果,但是某些数据库(MySQL和SQLite)提供了group_concat函数来执行此操作。
答案 1 :(得分:2)
显示并仅考虑那些订单......
SELECT s.SalesOrderNumber, COUNT (*) As Purchased
FROM Sales s
GROUP BY s.SalesOrderNumber
HAVING COUNT(*) > 1
所以我们按顺序分组,在HAVING中应用条件,然后在SELECT子句中显示SalesOrderNumber。
MySQL:
SELECT s.SalesOrderNumber, GROUP_CONCAT(DISTINCT ProductKey
ORDER BY ProductKey SEPARATOR '; ')
FROM Sales s
GROUP BY s.SalesOrderNumber
SQL Server:请参阅this answer一个重复的问题。基本上,使用FOR XML。
答案 2 :(得分:1)
SELECT s.ProductKey, COUNT (*) As Purchased
FROM
Sales s
GROUP BY s.ProductKey
having count(*) > 1
编辑 -
答案1 - 显示订单中购买了多个产品的产品 -
SELECT s.ProductKey, COUNT (*) As Purchased
FROM Sales s
WHERE SalesOrderNum in
(
select SalesOrderNum from Sales
group by SalesOrderNum having count(*) > 1
)
GROUP BY s.ProductKey
答案 3 :(得分:1)
1)试试这个:
SELECT s.ProductKey, COUNT (*) As Purchased
FROM
Sales s
GROUP BY s.ProductKey
HAVING COUNT(*) > 1