简体   繁体   English

计算 SQL 时的不同情况

[英]Count distinct case when SQL

Wondering if I could have a bit of help.想知道我是否可以得到一些帮助。 I'm still new to SQL and I am learning by the day trying to do something a bit more complicated each day.我对 SQL 还是个新手,我每天都在学习尝试做一些更复杂的事情。

I have a dataset which has duplicated order numbers in it.我有一个数据集,其中包含重复的订单号。 From this I am wanting to do two things: firstly I am looking at doing a count of the number of unique order numbers and then secondly the sum of all the order numbers.由此我想做两件事:首先,我正在计算唯一订单号的数量,然后是所有订单号的总和。

I have managed to achieve part two of this but I am having a bit of difficulty executing the Count of distinct order numbers.我已经设法实现了其中的第二部分,但是在执行不同订单号的计数时遇到了一些困难。

Please see below my query I know my joins are not correct right now as I will be working on them later.请参阅下面我的查询,我知道我的连接现在不正确,因为我稍后会处理它们。 I am working from an ODBC progress v10 and using Microsoft query manager to extract and then hand writing the code in note pad then transferring back to Excel as currently my company can't get me SSMS.我正在使用 ODBC 进度 v10,并使用 Microsoft 查询管理器提取并在记事本中手写代码,然后传输回 Excel,因为目前我的公司无法获得 SSMS。

SELECT 
    Company_0.CoaCompanyName,
    SopOrder_0.SooOrderDate,
    COUNT(DISTINCT CASE WHEN SopOrder_0.SooOrderNumber = SopOrder_0.SooOrderNumber THEN 1 ELSE 0 END) AS 'Orders',
    SUM(CASE WHEN SopOrder_0.SooOrderNumber IS NOT NULL THEN 1 ELSE 0 END) AS 'Order Items',
    SopOrderItem_0.SoiValue,
    SopOrder_0.SooParentOrderReference
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'

Current data looks like当前数据看起来像

Company Name           Order Numbers    
-------------------------------------
CompanyA                 Orderno1
CompanyA                 Orderno1
CompanyB                 Orderno2
CompanyB                 Orderno3
CompanyB                 Orderno3
CompanyB                 Orderno3

How I want it to look:我希望它看起来如何:

Company Name           Orders         Order Items
-------------------------------------------------
CompanyA                 1                2
CompanyB                 2                4

You could use count (distinct..) , count(*) and group by您可以使用count (distinct..)count(*)group by

    SELECT 
        Company_0.CoaCompanyName
        , Count(DISTINCT SopOrder_0.SooOrderNumber ) AS Orders
        , count(*) AS `Order Item`
    FROM SBS.PUB.Company Company_0
    INNER JOIN SBS.PUB.SopOrder SopOrder_0 ON Company_0.CompanyID = SopOrder_0.CompanyID
    INNER JOIN SBS.PUB.SopOrderItem SopOrderItem_0 ON SopOrder_0.SopOrderID = SopOrderItem_0.SopOrderID 
    WHERE SopOrder_0.SooOrderDate > '2019-01-01'
    GROUP BY Company_0.CoaCompanyName 

For readability, you should use explicit join syntax and avoid old implicit join syntax based on where condition.为了可读性,您应该使用显式join语法并避免基于where条件的旧式隐式join语法。

For composite column name, you could use back-ticks (" ` ").对于复合列名称,您可以使用反引号(“ ` ”)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM