繁体   English   中英

SQL Server:查询多个表以创建预格式化的“模板” csv,以导出到Excel

[英]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 joinexists来引入可用数据:

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 joingroup 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM