[英]How to Count Distinct on Case When?
我今天一直在建立查詢,但遇到問題了。 我有兩個唯一的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)
嘗試刪除ELSE
:
COUNT(DISTINCT CASE WHEN SopOrder_0.SooParentOrderReference LIKE 'INT%' THEN SopOrder_0.SooParentOrderReference END) AS num_int
您沒有指定錯誤,但是問題可能是THEN
返回了一個字符串,而ELSE
返回了一個數字-因此嘗試將字符串值轉換為數字。
另外,學習使用正確的,顯式的, 標准的 JOIN
語法。 簡單規則: 永遠不要在FROM
子句中使用逗號。
在SooOrderNumber或SooParentOrderReference上計數不相同,以您認為更合適。
如果您正在COUNT
,則需要將未計數的內容設置為NULL
。 我更喜歡在其他情況下添加其他內容,因為它更加一致和完整。
, 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。 所以你可以做類似...
這是您要嘗試執行的操作,但不支持...使用dups作為(選擇1作為id,'A'作為col1聯合全部選擇1,'A'聯合全部選擇1,'B'聯合全部選擇2 ,'B')從id的重復組中選擇id,count(dist colt 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;
這兩個版本應提供相同的結果集。
總會有辦法的!!
我無法解釋您遇到的錯誤。 您誤將別名使用單引號了,但是我實際上並不認為這會導致錯誤。
無論如何,我建議您先匯總每個訂單的訂單項,然后再加入:
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.