0

我有一个非规范化的客户订单表。我想计算销售了多少产品并按类型显示在表格中。

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

谢谢!

4

4 回答 4

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 函数来做到这一点。

于 2012-10-18T19:13:36.107 回答
2

Q1:查看HAVING子句

仅显示并考虑那些订单...

SELECT s.SalesOrderNumber, COUNT (*) As Purchased 
FROM Sales s
GROUP BY s.SalesOrderNumber
HAVING COUNT(*) > 1

所以我们按订单分组,在 HAVING 中应用条件,然后在 SELECT 子句中显示 SalesOrderNumber。

Q2:看看几种组连接技术。

MySQL:

SELECT s.SalesOrderNumber, GROUP_CONCAT(DISTINCT ProductKey
                                      ORDER BY ProductKey SEPARATOR '; ')
FROM Sales s
GROUP BY s.SalesOrderNumber

SQL Server:请参阅此对重复问题的答案。基本上,使用 FOR XML。

于 2012-10-18T19:13:54.543 回答
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
于 2012-10-18T19:12:14.980 回答
1

1)试试这个:

SELECT s.ProductKey, COUNT (*) As Purchased 
FROM
Sales s
GROUP BY s.ProductKey
HAVING COUNT(*) > 1
于 2012-10-18T19:13:26.390 回答