0

Мне нужна помощь в этом.Уникальные значения 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 

Но это не то, что я хочу, потому что есть ценности, которые являются комбинациями column5 и column6, которые являются одинаковыми. Смотри ниже.

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-02-09

Я сделал следующий запрос в 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 - номер строки заказа. Когда номер строки заказа поступает дважды по тому же номеру заказа, мы сделали две или более отдельных транзакций в этой строке из-за разных обстоятельств. Поэтому я не хочу рассчитывать с одинаковым отклонением дважды. – SisU

ответ

1

Похоже, что вы хотите сделать что-то, как вы хотите, чтобы отдельные строки из Table2, и присоединиться к/агрегировать их из Table1, поэтому с помощью 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

Привет, Роуленд. Кажется, это трюк, хотя я действительно не понимаю, что он делает (никогда не видел «WITH cte AS» раньше). :) Моя проблема заключается в том, что она работает в студиях управления SQL-серверами, но я использую аддон в Excel, который выполняет запрос и публикует результаты в моем списке. Мое сообщение об ошибке: «Недопустимый символ, в строке запроса». Но я полагаю, что мне трудно помочь в этом, поэтому мне придется попытаться выяснить это сам. – SisU

+0

Спасибо, кстати :) – SisU

+0

CTE (Commom Table Expression) эффективно создает представление «на лету», которое может использоваться в пределах области выражения. Предыдущее выражение должно быть явно прервано (следовательно, ';') использовать CTE. Альтернативно, вы можете создать фактическое представление в своей базе данных, которое представляет данные, которые вы хотите заполнить. –

Смежные вопросы