首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL Order By By Count(Distinct)

SQL Order By By Count(Distinct)
EN

Stack Overflow用户
提问于 2012-08-22 04:01:01
回答 3查看 1K关注 0票数 2

我有以下表格:

代码语言:javascript
复制
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

我的目标是有一个供应商列表和每种类型的文件连接的订单数量的计数。例如,此数据的最终结果应为:

代码语言:javascript
复制
VENDOR   | OR_CT | F1_CT | F2_CT
Company1 | 4        | 4        | 3

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

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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。我的数据库管理知识几乎完全是自学的,所以我很高兴自己能走到这一步。我的专长是网页设计。谢谢您抽时间见我。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-22 04:14:33

您的SQL会为我生成您想要的结果。

两条建议

  1. Order是一个表的坏名字-它与保留字冲突,会给您带来无休止的麻烦
  2. 您应该像这样连接您的表

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

而不使用where子句

也许你可以试试这个

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2012-08-22 04:49:20

试试这个:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2012-08-22 05:19:32

我将向您提出以下建议:

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

代码语言:javascript
复制
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

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

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

代码语言:javascript
复制
SELECT count(*) FROM `order`
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12062164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档