【问题标题】:How do I count how many distinct values a row possess?如何计算一行拥有多少不同的值?
【发布时间】:2017-07-28 16:31:13
【问题描述】:

假设我有一个纸质路线数据库。

Create table routes(route_number varchar(100), route_length varchar(1000)
Create table deliverers(deliv_name varchar(100))
Create table deliveries(Deliv_name varchar(100), route_number varchar(100), 
                        number_of_papers varchar(100), date_of delivery date(yyyy-mm-dd))

(我知道这还不完整,但我们不需要知道此示例的键)

我想知道每个送货员拥有的路线数量,而不是每条路线上发生的送货数量。如果送货员A有3条路线,并且他每年在这条路线上运送100次,我只想知道他有多少条路线。

我认为我需要使用集合论或外连接,但目前我无法解决这个问题。

【问题讨论】:

  • 添加适当的数据样本和预期的结果..

标签: mysql sql sqlite


【解决方案1】:

试试这个:

SELECT deliverers.deliv_name As DeliveryPerson, COUNT(DISTINCT route_number) As RoutesCount
FROM deliverers 
INNER JOIN deliveries ON deliveries.Deliv_name =  deliverers.deliv_name
GROUP BY (deliverers.deliv_name)

【讨论】:

    【解决方案2】:

    聚合函数可以使用 DISTINCT 仅聚合不同的值:

    SELECT deliv_name,
           count(DISTINCT route_number) AS routes
    FROM deliveries
    GROUP BY deliv_name;
    

    但是,如果您想包括还没有多少送货的送货员,您也必须查看deliverers 表。这可以通过outer join 来完成:

    SELECT deliv_name,
           count(DISTINCT route_number)
    FROM      deliverers
    LEFT JOIN deliveries USING (deliv_name)
    GROUP BY deliv_name;
    

    correlated subquery

    SELECT deliv_name,
           (SELECT count(DISTINCT route_number)
            FROM deliveries
            WHERE deliv_name = deliverers.deliv_name
           ) AS routes
    FROM deliverers;
    

    【讨论】:

      【解决方案3】:

      使用这个:

      SELECT      A.deliv_name, COUNT(DISTINCT route_number) AS "NoOfRoutes"
      FROM        dbo.deliverers A 
                  LEFT OUTER JOIN dbo.deliveries B 
                      ON A.deliv_name = B.Deliv_name
      GROUP BY    A.deliv_name
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-11
        • 2011-07-28
        • 2014-05-11
        • 1970-01-01
        相关资源
        最近更新 更多