我今天一直在建立查询,但遇到了麻烦。我有两个唯一的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)时的错误
答案 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;