【问题标题】:SQL Server : outputting duplicatesSQL Server:输出重复项
【发布时间】: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


【解决方案1】:

以下似乎或多或少是您想要的。您说您只能部分编辑您的查询,但是您需要 GROUP BY 子句来说明您想要哪些记录(即每个产品和客户一条记录),所以这是主要需要做的。然后你不能使用 OVER 子句,因为聚合组已经由 GROUP BY 给出。为了可读性,我做了更多的更改。看看您可以进行哪些修改。

select 
    sum(l.available_alt) as cases
  , p.unitofmeasure_alt
  , sum(l.available_stk) as [total stock]
  , p.unitofmeasure_stk
  , p.description1
  , p.productcode
  , c.name
  , c.customercode
from dc_transactions t
inner join ar_customers c on t.customerkey = c.customerkey
inner join ic_productlots l on t.lotkey = l.lotkey
inner join ic_products p on t.productkey = p.productkey
where p.productcode = '      515070' 
and (@showzeros in ('Y', 'YES') or l.available_stk > 0)
group by p.productcode, c.customercode
  , p.unitofmeasure_alt, p.unitofmeasure_stk, p.description1, c.name
order by p.productcode, c.customercode;

【讨论】:

  • 我们使用的系统的问题是不能直接编辑GROUP BY子句,也不能添加。
  • 好的,那么你又回到了开始的地方。您无需将 GROUP BY 子句与聚合函数一起使用,而是将与分析函数相同的聚合与 OVER 一起使用。然后,是的,使用 DISTINCT 删除重复项。正如您在此处看到的那样,这很有效:sqlfiddle.com/#!3/1a180/1.
猜你喜欢
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-19
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 2019-12-19
相关资源
最近更新 更多