0

我需要帮助解决这个问题。基于2列的SQL查询唯一值

目前,我有这个疑问:

SELECT Table1.Column1 AS Company 
    ,SUM(DATEDIFF(Day, Table2.Column2, Table1.Column3)) AS DiffDate 
FROM Table1 
INNER JOIN Table2 ON Table1.Column6 = Table2.Column6 
    AND Table1.Column5 = Table2.Column5 
GROUP BY Company 

这样做的结果是...

Company  DiffDate 

company1   8 

但这不是我想要的,因为有一些是组合值第5列和第6列是相同的。见下文。

Company | Column6 | Column5 | DiffDate 
Company1 | 5782 |  10 |  2 
Company1 | 5782 |  10 |  2 
Company1 | 5782 |  20 |  2 
Company1 | 5782 |  30 |  2 

所以结果我以后是6,不是8

我尝试使用SELECT DISTINCT但是,这并不做任何事情。

预先感谢您。

编辑2016年2月9日

我做在SSMS下面的查询。

;WITH cte AS (SELECT DISTINCT bestlevdat, bestradnr, bestnr FROM dbo.bpa) 
SELECT dbo.bp.ftgnr AS Företagsnr,SUM(DATEDIFF(Day,cte.bestlevdat, dbo.bp.bestberlevdat)) AS Diff_Bekräftat_dat, 
     SUM(DATEDIFF(Day,cte.bestlevdat, dbo.bp.bestbeglevdat)) AS Diff_Önskat_dat, COUNT(dbo.bp.bestradnr) AS AntalRader, SUM(CASE WHEN datediff(day, cte.bestlevdat, dbo.bp.bestberlevdat) < - 0 THEN 1 ELSE 0 END) AS Antal_avvikande_rader, ROUND((COUNT(dbo.bp.bestradnr) - SUM(CASE WHEN datediff(day, cte.bestlevdat, dbo.bp.bestberlevdat) < - 0 THEN 1.0 ELSE 0.0 END)) * 100/COUNT(dbo.bp.bestradnr), 1) AS Levsäk 
FROM dbo.bp INNER JOIN 
     cte ON dbo.bp.bestnr = cte.bestnr AND dbo.bp.bestradnr = cte.bestradnr 
WHERE  (YEAR(dbo.bp.bestberlevdat) = '2015') 
GROUP BY dbo.bp.ftgnr 
ORDER BY AntalRader DESC 

这是一种魅力。但是,当我创建一个新的视图并粘贴这个查询并尝试保存时,我在“;”上得到一个错误。再次。如果我删除“;” SSMS中,我得到错误“的多部分标识符‘cte.bestlevdat’无法绑定”,也转换我的查询到以下几点:

WITH cte AS (SELECT DISTINCT bestlevdat, bestradnr, bestnr 
         FROM   dbo.bpa AS bpa_1) 
SELECT  TOP (100) PERCENT dbo.bp.ftgnr AS Företagsnr, SUM(DATEDIFF(Day, cte_1.bestlevdat, dbo.bp.bestberlevdat)) AS Diff_Bekräftat_dat, SUM(DATEDIFF(Day, 
         cte_1.bestlevdat, dbo.bp.bestbeglevdat)) AS Diff_Önskat_dat, COUNT(dbo.bp.bestradnr) AS AntalRader, SUM(CASE WHEN datediff(day, cte.bestlevdat, 
         dbo.bp.bestberlevdat) < - 0 THEN 1 ELSE 0 END) AS Antal_avvikande_rader, ROUND((COUNT(dbo.bp.bestradnr) - SUM(CASE WHEN datediff(day, cte.bestlevdat, 
         dbo.bp.bestberlevdat) < - 0 THEN 1.0 ELSE 0.0 END)) * 100/COUNT(dbo.bp.bestradnr), 1) AS Levsäk 
FROM   dbo.bp INNER JOIN 
         cte AS cte_1 ON dbo.bp.bestnr = cte_1.bestnr AND dbo.bp.bestradnr = cte_1.bestradnr 
WHERE  (YEAR(dbo.bp.bestberlevdat) = '2015') 
GROUP BY dbo.bp.ftgnr 
ORDER BY AntalRader DESC 

很抱歉,如果我错过了一些东西很明显,但我与查询相当新,这是我第一次尝试“查看”。

+0

的样本数据表格会有所帮助。 – mxix

+0

为什么*不*你想要数它们?如果表2中有*两个这样的行怎么办?你怎么认定这是垃圾?那你为什么不把它从表2中删除呢? –

+0

我正在创建有关交付可靠性的统计信息。列6是订单号,列5是订单行号。当订单行号在同一订单号上出现两次时,由于情况不同,我们在该行上进行了2次或多次单独的交易。所以我不想用相同的偏差计算两次。 – SisU

回答

1

听起来像是你要像你想从表2的重复行做一些事情,并加入/从表1它们聚集,因此使用CTE可能会有帮助,所以是这样的:从两个

;WITH cte AS (
    SELECT DISTINCT 
       Column2, 
       Column5, 
       Column6 
    FROM  Table2 
) 
SELECT 
      Table1.Column1 AS Company, 
      SUM(DATEDIFF(Day, cte.Column2, Table1.Column3)) AS DiffDate 

FROM  Table1 

INNER JOIN cte 
    ON  Table1.Column6 = cte.Column6 
    AND  Table1.Column5 = cte.Column5 

GROUP BY Company 
+0

嗨罗兰,这似乎是做的伎俩,虽然我真的不明白它是什么(从来没有见过“与cte AS”之前)。 :)但我的问题是,它在SQL服务器管理工​​作室中工作,但我使用Excel中的插件来执行查询并将结果发布到我的列表中。我的错误消息是:“非法字符;在查询字符串”。但我想这件事很难帮助我,所以我必须尝试自己弄清楚。 – SisU

+0

谢谢你的方式:) – SisU

+0

CTE(Commom表达式)有效地创建了一个可以在表达式范围内使用的视图。前面的表达式必须明确地终止(因此';')才能使用CTE。或者,你可以在你的数据库上创建一个代表你想汇总的数据的实际视图。 –