Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计数内的SQL Order By(不同)_Sql_Sql Server_Count_Sql Order By_Distinct - Fatal编程技术网

计数内的SQL Order By(不同)

计数内的SQL Order By(不同),sql,sql-server,count,sql-order-by,distinct,Sql,Sql Server,Count,Sql Order By,Distinct,我有以下表格: 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 | fil

我有以下表格:

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
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
不幸的是,这会产生以下结果:

VENDOR   | OR_COUNT | F1_COUNT | F2_COUNT
Company1 | 4        | 5        | 3
我唯一的猜测是,因为我使用的是
COUNT(DISTINCT)
COUNT
自动假定
DISTINCT
是按
F1\u ID
排序的,而不是按
F1\u ORDR


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

您的SQL将生成您想要的结果

两条建议

  • Order对于表来说是一个坏名字——它与保留字冲突,并且会给您带来无尽的麻烦

  • 你应该像这样加入你的桌子

    来自文件类型1
    内部联接[顺序]
    在filetype1.f1上\u order=或\u 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
    
    试试这个:

    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
    

    我将向你提出以下建议:

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

    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
    
    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
    
    这将给出filetype的订单计数

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

    SELECT count(*) FROM `order`
    

    如果我想要一个连接到订单的总文件数,我的SQL就可以工作了。不幸的是,计数必须是附加了任何数量的文件类型的订单数。所以我想让它产生4,作为f1的结果,而不是5,它确实产生了。或者至少对我来说是这样哦,看来是卢斯卡打败了我。无论如何,您的原始代码也为我提供了正确的结果,因此我不确定问题出在哪里。