SQL 时计算不同的大小写
Count distinct case when SQL
想知道我是否能得到一点帮助。我对 SQL 还是个新手,我每天都在学习尝试每天做一些更复杂的事情。
我有一个数据集,其中包含重复的订单号。由此我想做两件事:首先,我正在计算唯一订单号的数量,然后是所有订单号的总和。
我已经成功完成了第二部分,但是我在执行不同订单号的计数时遇到了一些困难。
请在下面查看我的查询 我知道我的联接现在不正确,因为我稍后会处理它们。我正在使用 ODBC progress 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'
目前的数据看起来像
Company Name Order Numbers
-------------------------------------
CompanyA Orderno1
CompanyA Orderno1
CompanyB Orderno2
CompanyB Orderno3
CompanyB Orderno3
CompanyB Orderno3
我希望它看起来如何:
Company Name Orders Order Items
-------------------------------------------------
CompanyA 1 2
CompanyB 2 4
您可以使用 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
为了可读性,您应该使用显式 join
语法并避免基于 where
条件的旧隐式 join
语法。
对于复合列名,您可以使用反引号 ("`
")。
想知道我是否能得到一点帮助。我对 SQL 还是个新手,我每天都在学习尝试每天做一些更复杂的事情。
我有一个数据集,其中包含重复的订单号。由此我想做两件事:首先,我正在计算唯一订单号的数量,然后是所有订单号的总和。
我已经成功完成了第二部分,但是我在执行不同订单号的计数时遇到了一些困难。
请在下面查看我的查询 我知道我的联接现在不正确,因为我稍后会处理它们。我正在使用 ODBC progress 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'
目前的数据看起来像
Company Name Order Numbers
-------------------------------------
CompanyA Orderno1
CompanyA Orderno1
CompanyB Orderno2
CompanyB Orderno3
CompanyB Orderno3
CompanyB Orderno3
我希望它看起来如何:
Company Name Orders Order Items
-------------------------------------------------
CompanyA 1 2
CompanyB 2 4
您可以使用 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
为了可读性,您应该使用显式 join
语法并避免基于 where
条件的旧隐式 join
语法。
对于复合列名,您可以使用反引号 ("`
")。