2

私は次のテーブルを持っています:

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ていると自動的に想定しているということですDISTINCTF1_IDF1_ORDR

誰かがCOUNT(DISTINCT)注文するように指示する方法について私を助けることができれば、F1_ORDRそれは最も役に立ちます。広大なインターネットで解決策を探しましたが、検索エンジンやフォーラムなどに何をしたいかを説明するのは難しいです。私のデータベースはMicrosoftSQLServerを使用しています。私のデータベース管理の知識はほぼ完全に独学で学んでいるので、これまで自分で学んだことをうれしく思います。私の専門はウェブデザインです。お時間をいただきありがとうございます。

4

3 に答える 3

1

あなたのSQLはあなたが私に望む結果をもたらします。

2つのアドバイス

  1. 順序はテーブルの悪い名前です-予約語と競合し、面倒なことは終わりません

  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
于 2012-08-21T20:14:32.927 に答える
0

これを試して:

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
于 2012-08-21T20:49:20.230 に答える
0

私はあなたにこれを提案します:

filetype1テーブルとfiletype2テーブルを1つのテーブル(filetype)にマージし、タイプINTまたはTINTYINTの--f_type(たとえば)という名前の別のフィールドを追加して、ファイルタイプ(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`
于 2012-08-21T21:19:31.837 に答える