SQL Server查询到非规范化表

时间:2012-10-18 19:08:22

标签: sql-server

我有一个非标准化的客户订单表。我想要计算出售的产品数量,并按类型在表格中显示。

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 个答案:

答案 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)

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:请参阅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