【问题标题】:SQL Order By Within A Count(Distinct)SQL Order By Within A Count(Distinct)
【发布时间】:2012-08-21 20:01:01
【问题描述】:

我有以下表格:

filetype1
F1_ID | F1_ORDR | FILENAME
1     | 1        | file1.txt
2     | 2        | file2.txt
3     | 3        | file3.txt
4     | 2        | file4.txt
5     | 4        | file5.txt

filetype2
F2_ID | F2_ORDR | FILENAME
1     | 1        | file6.txt
2     | 2        | file7.txt
3     | 4        | file8.txt

ordr
OR_ID | OR_VENDOR
1     | 1
2     | 1
3     | 1
4     | 1

vendor
VE_ID | VE_NAME
1     | Company1

我的目标是列出供应商列表,并计算每种类型的文件连接的订单数量。例如,这个数据的最终结果应该是:

VENDOR   | OR_CT | F1_CT | F2_CT
Company1 | 4        | 4        | 3

因为至少 1 个 type1 文件附加到 4 个不同的订单,并且至少 1 个 type2 文件附加到 3 个不同的订单。目前我的 SQL 代码如下所示:

SELECT vendor.ve_id, vendor.ve_name,
       (SELECT COUNT(or_id)
        FROM ordr
        WHERE ordr.or_vendor = vendor.ve_id) as OR_COUNT, 
       (SELECT COUNT(DISTINCT f1_order)
        FROM filetype1 INNER JOIN ordr ON filetype1.f1_ordr = ordr.or_id
        WHERE ordr.or_vendor = vendor.ve_id) as F1_CT,
       (SELECT COUNT(DISTINCT f2_ordr)
        FROM filetype2 INNER JOIN ordr ON filetype2.f2_ordr = ordr.or_id
        WHERE ordr.or_vendor = vendor.ve_id) as F2_CT
FROM vendor
ORDER BY vendor.ve_name

不幸的是,这会产生以下结果:

VENDOR   | OR_COUNT | F1_COUNT | F2_COUNT
Company1 | 4        | 5        | 3

我唯一的猜测是,因为我使用的是COUNT(DISTINCT),所以COUNT 会自动假设DISTINCT 是按F1_ID 而非F1_ORDR 订购的

如果有人可以帮助我告诉COUNT(DISTINCT)F1_ORDR 订购,那将是最有帮助的。我在广阔的互联网上搜索了一个解决方案,但很难向搜索引擎、论坛等解释我想要什么。我的数据库使用 Microsoft SQL Server。我的数据库管理知识几乎完全是自学的,所以我很高兴自己能做到这一点。我的专长是网页设计。感谢您的宝贵时间。

【问题讨论】:

    标签: sql sql-server count sql-order-by distinct


    【解决方案1】:

    你的 SQL 产生了你想要的结果。

    两条建议

    1. Order 是一个不好的表名称 - 它与保留字冲突,会给您带来无穷无尽的麻烦

    2. 你应该像这样加入你的桌子

      FROM filetype1 inner join [order] on filetype1.f1_order = or_id

    而不是使用 where 子句

    不妨试试这个

    select 
        vendor.VE_ID, vendor.VE_NAME,   
        count(distinct or_id),
        count(distinct f1_order),
        count(distinct f2_order)
    
    from 
        vendor
            left join [order]
                on vendor.VE_ID = [order].OR_VENDOR
            inner join filetype1 
                on [order].OR_ID = filetype1.F1_ORDER
            left join filetype2
                on [order].OR_ID = filetype2.F2_ORDER
    group by
        vendor.VE_ID, vendor.VE_NAME
    

    【讨论】:

    • 如果我想计算连接到订单的文件总数,我的 SQL 可以工作。不幸的是,计数必须是附加了任意数量的文件类型的订单数。所以我希望它产生 4 作为 f1_ct 的结果,而不是 5。
    • 确实如此。或者至少,它对我有用。 :)
    【解决方案2】:

    试试这个:

    SELECT
    vdr.VE_NAME   
    ,COUNT(DISTINCT OR_ID) AS OR_ID 
    ,COUNT(DISTINCT ft1.F1_ORDER) AS FT1_COUNT
    ,COUNT(DISTINCT ft2.F2_ORDER) AS FT2_COUNT
    FROM
        vendor vdr
        LEFT OUTER JOIN [order] odr
            ON vdr.VE_ID = odr.OR_VENDOR
        INNER JOIN filetype1 ft1
            ON  odr.OR_ID = ft1.F1_ORDER
        LEFT OUTER JOIN filetype2 ft2
            ON odr.OR_ID = ft2.F2_ORDER
    GROUP BY
        vdr.VE_ID
        ,vdr.VE_NAME
    

    【讨论】:

    • Aww,看起来 podiluska 打败了我。无论如何,您的原始代码也为我产生了正确的结果,所以我不确定问题出在哪里。
    【解决方案3】:

    我会建议你这样做:

    在一个表(文件类型)中合并文件类型 1 和文件类型 2 表,并添加另一个名为 - f_type(例如)类型为 INT 或 TINTYINT 的字段来存储文件类型(1 或 2)。这具有以后轻松添加另一个文件类型的好处 现在查询将如下所示:

    SELECT 
    vendor.ve_name,
    count(DISTINCT filetype.f_order),
    filetype.f_type
    FROM 
       filetype
           INNER JOIN `order`
               ON filetype.f_order = `order`.or_id
           INNER JOIN vendor
               ON `order`.or_vendor = vendor.ve_id
       GROUP BY vendor.ve_id,filetype.f_type
    

    这将给出文件类型的订单计数。

    对于总订单,只需添加另一个查询:

    SELECT count(*) FROM `order`
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      • 2020-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多