[英]SQL Server: query multiple tables to create a pre-formated “template” csv for export into Excel
我正在尝试创建完成以下任务所需的SQL。 顺便说一句,我针对托管的SQL Server数据库使用服务器端Report Builder,因此我只能做些事情。 有3张桌子。 销售员表(销售),项目表(项目)和交易表(tx)。
这是一个例子:
销售人员表(销售)
Person A
Person B
项目ID表(项目)
10
20
30
100
200
300
1000
2000
3000
交易表(TX)
100 (person A)
300 (person B)
300 (person A)
200 (person B)
报表生成器中的所需结果:
Person A
Item 100: 1
Item 200: 0 (NULL)
Item 300: 1
-- NEW PAGE --
Person B:
Item 100: 0 (NULL)
Item 200: 1
Item 300: 1
我的问题:这是我想出的SQL。 我需要能够生成一致的结果集,而不管某个销售人员是否出售了某件商品,以便更轻松地导入Excel。 另外,我只查找代码在100到300之间且在指定日期范围内的项目。 我的SQL忽略了日期范围和项目代码范围。 我最初在WHERE子句中具有这些指令,但它仅返回两个表中的那些行,并且丢失了任何值为null的itemcode(充当INNER连接)的占位符。 在报表制作工具中,我将统计销售员售出的每种商品的数量。
SELECT
tx.date, sales.salesperson, items.itemcode
FROM
tx
LEFT OUTER JOIN
itemcode ON (tx.itemcode = items.itemcode)
AND (date BETWEEN "10/1/2017" AND "12/31/2017")
AND (itemcode BETWEEN "100" AND "300")
INNER JOIN
sales ON (tx.salesID = sales.salesID)
ORDER BY
itemcode ASC
非常感谢您对我的挑战的任何见解!
如果您需要所有销售人员和所有项目,则可以使用cross join
生成行。 您可以使用left join
或exists
来引入可用数据:
select s.person, i.itemcode,
(case when exists (select 1
from tx
where tx.salesid = s.salesid and tx.itemcode = i.itemcode
)
then 1 else 0
end) as has_sold
from sales s cross join
items i
where i.itemcode between 100 and 300
order by s.saledid, i.itemcode;
如果要计数,请使用left join
和group by
:
select s.person, i.itemcode, count(tx.salesid) as num_sold
from sales s cross join
items i left join
tx
on tx.salesid = s.salesid and tx.itemcode = i.itemcode
where i.itemcode between 100 and 300
order by s.saledid, i.itemcode;
这是一个使用cross join
(获取销售和商品的所有组合)和left join
(获取给定日期的交易)的示例
SELECT
tx.date, sales.salesperson, items.itemcode
FROM
Items
CROSS JOIN
sales
LEFT OUTER JOIN
tx ON (items.itemcode = tx.itemcode)
AND date BETWEEN '10/1/2017' AND '12/31/2017'
AND (tx.salesID = sales.salesID)
WHERE
(items.itemcode BETWEEN '100' AND '300')
ORDER BY
itemcode ASC
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.