Как рассчитывать на случай, когда? - PullRequest
0 голосов
/ 08 марта 2019

Сегодня я создавал запрос и застрял. У меня есть два уникальных идентификатора, которые определяют, является ли и порядок внутренним или сетевым. Я был в состоянии разделить это, так что он подсчитывает, сколько раз они появляются, но, к сожалению, он не дает мне ожидаемого результата. По результатам исследований я попытался создать заявление «Определить случай, когда», чтобы предоставить мне результаты.

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

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

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

Как вы можете видеть из моего текущего результата, он считает каждую строку, даже если это одна и та же ссылка. Теперь это не жесткое и быстрое правило, которое всегда удваивается. Вот почему я думаю, что мне нужен случай с графом. Ниже мой запрос, который я сейчас использую. Это тянуть из 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)

Ответы [ 3 ]

0 голосов
/ 08 марта 2019

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

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

, 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 выберите 1, «A» union all выберите 1, «B» union all выберите 2, «B» ) выберите идентификатор , считать (отличный col1) как col_count от дупла сгруппировать по идентификатору;

Вставьте еще один 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 версии должны давать одинаковый набор результатов.

Всегда есть способ !!

0 голосов
/ 11 марта 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;
0 голосов
/ 08 марта 2019

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

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

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

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

...