2015-09-20 3 views
0

У меня есть ниже код, который возвращает результат, как показано ниже (обратите внимание на порядок метод используется так, что можно сортировать данные)Использование Distinct Count в/с подзапрос

Week_Variance_Range Returns_Due ORDERMETHOD 
    Thisweek    11   05 
    -1     11   02 
    -2     12   03 
    -3     5    04 

Теперь это приносит через все данные, и я только что обнаружил, что есть дублированные идентификаторы возврата (RtnId), но мой анализ требует различных значений.

Итак, для This week можно сказать, что было 11 возвратов. 2 может исходить из того же возвратного Id и в результате рисунок на этой неделе должен быть 10, а не 11.

Пожалуйста, смотрите код ниже:

SELECT   
    Week_Variance_Range, 
    COUNT(*) AS Returns_Due, 
    CASE 
     WHEN t.Week_Variance_Range = 'Created This Week ' THEN '01' 
     WHEN t.Week_Variance_Range = '-1' THEN '02' 
     WHEN t.Week_Variance_Range = '-2' THEN'03' 
     WHEN t.Week_Variance_Range = '-3' THEN '04' 
     WHEN t.Week_Variance_Range = '-4' THEN '05' 
     WHEN t.Week_Variance_Range = '-5' THEN '06' 
     WHEN t.Week_Variance_Range = '-9 to - 6 ' THEN '07' 
     WHEN t.Week_Variance_Range = '-19 to - 10 ' THEN '08' 
     WHEN t.Week_Variance_Range = '-39 to - 20 ' THEN '09' 
     WHEN t.Week_Variance_Range = '-59 to - 40 ' THEN '10' 
     WHEN t.Week_Variance_Range = '-79 to - 60 ' THEN '11' 
     WHEN t.Week_Variance_Range = '-99 to - 80 ' THEN '12' 
     WHEN t.Week_Variance_Range = '-500 to - 100 ' THEN '13' 
    END AS ORDERMETHOD 
FROM (
    SELECT   
     CASE 
      WHEN abs(DATEDIFF(WEEK, RtnDt, GETDATE())) * - 1 BETWEEN - 500 AND - 100 THEN '-500 to - 100 ' 
      WHEN abs(DATEDIFF(WEEK, RtnDt, GETDATE())) * - 1 BETWEEN - 99 AND - 80 THEN '-99 to - 80 ' 
      WHEN abs(DATEDIFF(WEEK, RtnDt, GETDATE())) * - 1 BETWEEN - 79 AND - 60 THEN '-79 to - 60 ' 
      WHEN abs(DATEDIFF(WEEK, RtnDt, GETDATE())) * - 1 BETWEEN - 59 AND - 40 THEN '-59 to - 40 ' 
      WHEN abs(DATEDIFF(WEEK, RtnDt, GETDATE())) * - 1 BETWEEN - 39 AND - 20 THEN '-39 to - 20 ' 
      WHEN abs(DATEDIFF(WEEK, RtnDt, GETDATE())) * - 1 BETWEEN - 19 AND - 10 THEN '-19 to - 10 ' 
      WHEN abs(DATEDIFF(WEEK, RtnDt, GETDATE())) * - 1 BETWEEN - 9 AND - 6 THEN '-9 to - 6 ' 
      WHEN abs(DATEDIFF(WEEK, RtnDt, GETDATE())) * - 1 = - 5 THEN '-5 ' 
      WHEN abs(DATEDIFF(WEEK, RtnDt, GETDATE())) * - 1 = - 4 THEN '-4 ' 
      WHEN abs(DATEDIFF(WEEK, RtnDt, GETDATE())) * - 1 = - 3 THEN '-3 ' 
      WHEN abs(DATEDIFF(WEEK, RtnDt, GETDATE())) * - 1 = - 2 THEN '-2 ' 
      WHEN abs(DATEDIFF(WEEK, RtnDt, GETDATE())) * - 1 = - 1 THEN '-1 ' 
      WHEN abs(DATEDIFF(WEEK, RtnDt, GETDATE())) * - 1 = 0 THEN 'Created This Week ' 
     END AS Week_Variance_Range 
    FROM dbo.vw_AN_Admin_VendorReturns 
    WHERE (Complete <> 'X') 
) AS t 
GROUP BY Week_Variance_Range 
ORDER BY ORDERMETHOD 
+0

Рассмотрите возможность размещения текста вашего дела в таблице и перехода к нему - столбец для текста. Стол должен будет присоединиться к 6,7,8,9 всего к одному и тому же caseText. – Paparazzi

ответ

1

Добавьте RtnId к отборному заявлению в производном таблицу и использовать count(distinct rtnid) во внешнем запросе.

SELECT   
    Week_Variance_Range, 
    COUNT(DISTINCT RtnId) AS Returns_Due, 
    /* long case expression */ 
FROM (
    SELECT RtnId,  
     /* long case expression */ 
    FROM dbo.vw_AN_Admin_VendorReturns 
    WHERE (Complete <> 'X') 
) AS t 
GROUP BY Week_Variance_Range 
ORDER BY ORDERMETHOD