Как считать Отличительные в случае, когда?

Сегодня я создавал запрос, и я застрял. У меня есть два уникальных идентификатора, которые определяют, является ли порядок внутренним или веб-. Я смог разделить это, чтобы он подсчитывал, сколько раз они появляются, но, к сожалению, это не дает мне ожидаемого результата. Из исследования я попытался создать оператор Count Distinct Case When, чтобы предоставить мне результаты.

Пожалуйста, смотрите ниже, где я разбил, что он делает и как я ожидаю, что это будет.

Исходные данные выглядят так:

Company Name       Order Date       Order Items      Orders     Value      REF
-------------------------------------------------------------------------------
CompanyA           03/01/2019        Item1           Order1      170       INT1
CompanyA           03/01/2019        Item2           Order1      0         INT1
CompanyA           03/01/2019        Item3           Order2      160       WEB2
CompanyA           03/01/2019        Item4           Order2      0         WEB2

Как я ожидаю, что это будет:

Company Name       Order Date       Order Items      Orders     Value      WEB       INT
-----------------------------------------------------------------------------------------
CompanyA           03/01/2019            4             2         330        1         1

Что сейчас выходит

Company Name       Order Date       Order Items      Orders     Value      WEB       INT
 -----------------------------------------------------------------------------------------
 CompanyA           03/01/2019            4             2         330        2         2

Как вы можете видеть из моего текущего результата, он считает каждую строку, хотя это одна и та же ссылка. Теперь это не жесткое и быстрое правило, что оно всегда удваивается. Вот почему я думаю, что мне нужен Count Distinct Case When. Ниже приведен мой запрос, который я сейчас использую. Это извлечение из ODBC Progress V10, которое я подключаю через Excel. К сожалению, у меня нет SSMS, а Microsoft Query просто бесполезен.

Мой текущий SQL:

SELECT 

Company_0.CoaCompanyName
, SopOrder_0.SooOrderDate
, Count(DISTINCT SopOrder_0.SooOrderNumber) AS 'Orders'
, SUM(CASE WHEN SopOrder_0.SooOrderNumber IS NOT NULL THEN 1 ELSE 0 END) AS 'Order Items'
, SUM(SopOrderItem_0.SoiValue) AS 'Order Value'
, SUM(CASE WHEN SopOrder_0.SooParentOrderReference LIKE 'INT%' THEN 1 ELSE 0 END) AS 'INT'
, SUM(CASE WHEN SopOrder_0.SooParentOrderReference LIKE 'WEB%' THEN 1 ELSE 0 END) AS 'WEB'

FROM 

SBS.PUB.Company Company_0
, SBS.PUB.SopOrder SopOrder_0
, SBS.PUB.SopOrderItem SopOrderItem_0

WHERE 

SopOrder_0.SopOrderID = SopOrderItem_0.SopOrderID 
AND Company_0.CompanyID = SopOrder_0.CompanyID
AND SopOrder_0.SooOrderDate > '2019-01-01'

GROUP BY 

Company_0.CoaCompanyName
, SopOrder_0.SooOrderDate

Я попытался использовать следующую строку, но при импорте у меня возникают ошибки:

, Count(DISTINCT CASE WHEN SopOrder_0.SooParentOrderReference LIKE 'INT%' THEN  SopOrder_0.SooParentOrderReference ELSE 0 END) AS 'INT'

Просто знайте, что ошибка, которую я получаю при импорте в данный момент, является синтаксической ошибкой в ​​​​или около «CASE WHEN sopOrder_0.SooParentOrderRefer» (10713)


person Jack Williams    schedule 08.03.2019    source источник
comment
Count(0) все равно вернет 1. Вы можете попробовать либо полностью удалить else, как это предлагается в ответе @GordonLinoff, либо использовать ELSE null.   -  person Andrew    schedule 08.03.2019


Ответы (3)


Попробуйте удалить ELSE:

COUNT(DISTINCT CASE WHEN SopOrder_0.SooParentOrderReference LIKE 'INT%' THEN  SopOrder_0.SooParentOrderReference END) AS num_int

Вы не указываете ошибку, но проблема, вероятно, в том, что THEN возвращает строку, а ELSE - число, поэтому есть попытка преобразовать строковые значения в число.

Кроме того, научитесь использовать правильный, явный, стандартный синтаксис JOIN. Простое правило: Никогда не используйте запятые в предложении FROM.

person Gordon Linoff    schedule 08.03.2019
comment
Здравствуйте, Гордон. Извините за это, когда я удаляю ELSE, он все равно возвращается с ошибкой: синтаксическая ошибка в или около CASE WHEN sopOrder_0.SooParentOrderRefer (10713) - person Jack Williams; 08.03.2019

считать отдельные в SooOrderNumber или SooParentOrderReference, в зависимости от того, что имеет для вас больше смысла.

Если вы COUNT делаете, вам нужно сделать NULL то, что вы не считаете. Я предпочитаю включать else в case, потому что это более последовательно и полно.

, Count(DISTINCT CASE WHEN SopOrder_0.SooParentOrderReference LIKE 'INT%' THEN  SopOrder_0.SooParentOrderReference ELSE null END) AS 'INT'

Гордон Линофф прав в отношении источника вашей ошибки, то есть несоответствия типа данных между регистром, а затем значением, иначе значение заканчивается. null удаляет (должен удалить) эту двусмысленность - мне нужно дважды проверить.

Редактирование моего предыдущего ответа...

Несмотря на то, что, как вы говорите, похоже, что в Pervasive PSQL не поддерживается подсчет отдельных, CTE поддерживаются. Итак, вы можете сделать что-то вроде...

Это то, что вы пытаетесь сделать, но это не поддерживается ... с дубликатами как ( выберите 1 как идентификатор, «A» как col1 union all select 1, «A» union all select 1, «B» union all select 2 , 'B' ) выберите id ,count(различный col1) как col_count из группы дубликатов по id;

Вставьте еще один CTE в запрос, чтобы сначала удалить дубликаты данных. Тогда считайте как обычно. Это должно сработать...

with
dups as
(
select 1 as id, 'A' as col1 union all select 1, 'A' union all select 1, 'B' union all select 2, 'B'
)
,de_dup as
(
select id
      ,col1
  from dups
group by id
        ,col1
)
select id
      ,count(col1) as col_count
  from de_dup
group by id;

Эти 2 версии должны дать один и тот же набор результатов.

Всегда есть выход!!

person Liam Caffrey    schedule 08.03.2019
comment
Здравствуйте, Лиам. Я включил то, что вы предложили выше, и когда я пытаюсь вернуть это обратно в Excel, ошибка все еще возникает: синтаксическая ошибка в или около CASE WHEN sopOrder_0.SooParentOrderRefer (10713) Мой код в оператор выбора теперь: , Count(DISTINCT CASE WHEN SopOrder_0.SooParentOrderReference LIKE 'INT%' THEN SopOrder_0.SooParentOrderReference ELSE null END) AS 'INT' , Count(DISTINCT CASE WHEN SopOrder_0.SooParentOrderReference LIKE 'WEB%' THEN SopOrder_0.SooParentOrderReference ELSE null END) AS 'WEB' - person Jack Williams; 08.03.2019
comment
Я не знаком с Progress, и я бы попытался получить такой инструмент, как DBeaver, для подключения к вашей БД. Попробуйте каждый из них в Excel select count(distinct case when 1 = 1 then 1 else null end); -- should return 1 select count(distinct case when 1 = 0 then 1 else null end); -- should return 0 Если это не сработает, драйверы Progress не работают. - person Liam Caffrey; 08.03.2019
comment
Затем попробуйте... select count(case when 1 = 1 then 1 else null end); select count(case when 1 = 0 then 1 else null end); Если они работают, а число уникальных значений не работает, значит, число различных значений не реализовано в процессе выполнения. - person Liam Caffrey; 08.03.2019
comment
Привет, Лиам, счет выбора (случай, когда работает нормально, так как он работает дальше. Я думаю, что собираюсь остановиться на том факте, что Progress не поддерживает счет (отличный случай, когда - person Jack Williams; 11.03.2019

Я не могу объяснить ошибку, которую вы получаете. Вы по ошибке используете одинарные кавычки для псевдонимов, но я на самом деле не думаю, что это вызывает ошибку.

В любом случае, я предлагаю вам сначала объединить позиции вашего заказа в заказ и только потом присоединиться:

SELECT
  c.coacompanyname
, so.sooorderdate
, COUNT(*) AS orders
, SUM(soi.itemcount) AS order_items
, SUM(soi.ordervalue) AS order_value
, COUNT(CASE WHEN so.sooparentorderreference LIKE 'INT%' THEN 1 END) AS int
, COUNT(CASE WHEN so.sooparentorderreference LIKE 'WEB%' THEN 1 END) AS web
FROM sbs.pub.company c
JOIN sbs.pub.soporder so ON so.companyid = c.companyid
JOIN 
(
  SELECT soporderid, COUNT(*) AS itemcount, SUM(soivalue) AS ordervalue
  FROM sbs.pub.soporderitem
  GROUP BY soporderid
) soi ON soi.soporderid = so.soporderid
GROUP BY c.coacompanyname, so.sooorderdate
ORDER BY c.coacompanyname, so.sooorderdate;
person Thorsten Kettner    schedule 11.03.2019