【发布时间】:2015-06-24 12:08:31
【问题描述】:
我使用的是预建程序,所以我无法直接编辑 SQL,我只能编辑它的 sn-ps。我遇到的问题是代码正在为客户拥有的许多案例打印出客户代码。例如,如果客户有 57 个案例,它将打印 57 次客户代码,而不是仅显示一次,例如客户代码 4 案例 57 等。
我读到您可能无法将 Unique 或 Distinct 函数与 OVER 命令一起使用,但我不确定没有它如何使 sum 起作用。这是我的代码:
SET NOCOUNT ON;
DECLARE @ShowZeros nVarChar(4000);
SET @ShowZeros = 'N';
SELECT
SUM ([IC_ProductLots].[Available_Alt]) OVER(PARTITION BY [AR_Customers]. [CustomerCode]) AS [Cases]
, IC_Products.UnitOfMeasure_Alt
, SUM([IC_ProductLots].[Available_Stk]) OVER(PARTITION BY [AR_Customers]. [CustomerCode]) AS [Total Stock]
, IC_Products.UnitOfMeasure_Stk
, IC_Products.Description1
, IC_Products.ProductCode
, AR_Customers.Name
, AR_Customers.CustomerCode
FROM
((( DC_Transactions
INNER JOIN
AR_Customers ON DC_Transactions.CustomerKey = AR_Customers.CustomerKey)
INNER JOIN
IC_ProductLots ON DC_Transactions.LotKey = IC_ProductLots.LotKey)
INNER JOIN
IC_Products ON DC_Transactions.ProductKey = IC_Products.ProductKey)
WHERE
(IC_Products.ProductCode = ' 515070') AND
((CASE WHEN @ShowZeros = 'Y' or @ShowZeros = 'YES' THEN 1 ELSE
(ISNULL([IC_ProductLots].[Available_Stk],0))
END) > 0)
ORDER BY
IC_Products.ProductCode
, AR_Customers.CustomerCode
, AR_Customers.Name
输出应如下所示:
Cases | U/M | Total Stock | Description | Cust Name | Cust Code
-----------------------------------------------------------------
57 | CS | 1779.45 | Food | Restaurant | 2
4 | CS | 120 | Dough | Bakery | 44
目前它为客户代码 2 打印 57 行,为客户代码 44 打印 4 行,为每个客户代码显示相同的信息。
【问题讨论】:
-
首先:你的结果应该包含哪些记录?每个客户代码一条记录?但是,要展示哪些产品细节呢?还是每个客户代码和产品一条记录?或者还有什么?顺便说一句:“我使用的是 DBMS,所以我无法直接编辑 SQL”没有意义。
-
@ThorstenKettner 记录应包含箱数、箱数计量单位 (CS)、总库存重量、计量单位 (lbs)、产品描述、名称客户,以及客户代码的名称。例如,它应该看起来像我在上面的问题中添加的内容。
-
您正在执行一对多联接(客户到事务),但希望只从客户表中获取一个实例?唯一的方法是将所有内容放在引用详细信息表的聚合(MIN、MAX、SUM、AVG 等)中,并且从您的最后评论中,您正在寻找完整的详细信息。
-
选择数据时首先要回答的是:“我要每______条记录”。您不直接给出此答案,但由于您想同时查看客户名称和产品描述,我想您希望每个客户和产品都有一个结果记录。所以这些是要分组的列。我会写一个答案。
标签: sql sql-server duplicates unique distinct