我有以下表格:
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
< / p>
如果有人可以帮助我告诉COUNT(DISTINCT)
按F1_ORDR
订购最有帮助的人。我已经在广阔的互联网上搜索了一个解决方案,但很难解释我想要的搜索引擎,论坛等。我的数据库使用的是Microsoft SQL Server。我对数据库管理的知识几乎完全是自学的,所以我很高兴我自己做到这一点。我的专长是网页设计。谢谢你的时间。
答案 0 :(得分:1)
你的SQL会产生你想要的结果。
两条建议
订单是表格的错误名称 - 它与保留字词冲突,并且会让您无后顾之忧
你应该像这样加入你的桌子
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
答案 1 :(得分: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
答案 2 :(得分:0)
我会建议你这个:
将filetype1和filetype2表合并到一个表(filetype)中,并添加另一个名为-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`