簡體   English   中英

如何區分案件的時間?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM