如何区分案件的时间?

时间:2019-03-08 15:00:07

标签: sql distinct openedge case-when progress-db

我今天一直在建立查询,但遇到了麻烦。我有两个唯一的ID,分别用于标识和订购是Internal还是Web。我已经能够将其拆分,因此它可以计算它们出现的次数,但是不幸的是,它没有为我提供预期的结果。从研究中,我尝试创建一个“ Count Distinct Case While”语句以向我提供结果。

请在下面查看我在哪里细分了它的工作以及我的期望。

原始数据如下:

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

从我当前的结果可以看出,即使它是相同的引用,它也在对每一行进行计数。现在,始终将其加倍并不是一个硬性规定。这就是为什么我认为何时需要计数不同的案例。以下是我当前正在使用的查询。这是从我通过Excel连接的Progress V10 ODBC中获得的。不幸的是,我没有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 :(得分:0)

尝试删除ELSE

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

您没有指定错误,但是问题可能是THEN返回一个字符串,而ELSE返回一个数字-因此尝试将字符串值转换为数字。

另外,学习使用正确的,明确的,标准 JOIN语法。简单规则:从不FROM子句中使用逗号。

答案 1 :(得分:0)

SooOrderNumber或SooParentOrderReference上的计数不同,以您认为更合适。

如果您正在COUNT,则需要将NULL做为您不算的东西。在这种情况下,我更喜欢包含else,因为它更加一致和完整。

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

关于错误的来源,Gordon Linoff是正确的,即案例之间的数据类型不匹配,然后是值,否则是值结束。 null消除(应该消除)这种歧义-我需要仔细检查。

编辑我先前的答案...

尽管您看起来像Pervasive PSQL中不支持count count一样,但仍支持CTE。所以你可以做类似...

这是您要尝试执行的操作,但不支持...     与     像     (     选择1作为ID,将'A'作为col1联合全部选择1,'A'联合全部选择1,'B'联合全部选择2,'B'     )     选择编号           ,count(distcolt 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个版本应提供相同的结果集。

总有办法!

答案 2 :(得分:0)

我无法解释您遇到的错误。您误将别名使用单引号了,但是我实际上并不认为这引起了错误。

无论如何,建议您先汇总每个订单的订单项,然后再加入:

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;