繁体   English   中英

针对同一数据库列将多个查询作为单个结果集返回

[英]Returning multiple queries as a single result set against the same database columns

因此,我试图创建一个报告,该报告将为我提供销售订单的数量并将其与以前的日期范围进行比较。 不幸的是,由于这些计算都是针对同一表列运行的,因此我不确定如何返回结果。

理想情况下,我的输出应如下所示,包括NULL值

partner    Today    LastYear    TwoYear
-------    ------   --------    --------
zzz        10       15          4
yyy        2                    4
xxx        3        1           2

我有基本的想法:

DECLARE @currentDay DATETIME
SET @currentDay =  DATEDIFF(day,0,GETDATE()) -- Gives it 00:00:00.000 for time

-- Todays orders
SELECT count(s.po_id) as 'Orders Today',c.tp_name
FROM [EDI_001].[dbo].[303v850h] as s
join [EDI_001].[dbo].[Trade] as c
on s.TP_PartID = c.TP_PartID
where s.ExportDate < @currentDay AND
      s.ExportDate > DATEADD(day,-1,@currentDay)
group by c.tp_name
order by c.tp_name;

-- Last Years Day's orders
SELECT count(s.po_id) as 'Orders Today',c.tp_name
FROM [EDI_001].[dbo].[303v850h] as s
join [EDI_001].[dbo].[Trade] as c
on s.TP_PartID = c.TP_PartID
where s.ExportDate < DATEADD(year,-1,@currentDay) AND
      s.ExportDate > DATEADD(year, -1,DATEADD(day,-1,@currentDay))
group by c.tp_name
order by c.tp_name;

我将继续并在此处停止,因为您可以看到只是更改where子句中的日期范围,查询几乎是相同的。 我不知道如何将两个查询合并为一个结果集。 同样,我的联接在任何一个查询中都不返回空集。 我意识到它不会与当前使用的联接一起使用,但是在左外部联接中也没有显示出不同的结果...但是实际上,一次出现一个问题,第一步是获取单个结果集。 任何帮助将不胜感激。

您正在寻找UNION运算符。 它用于合并两个或多个SELECT语句的结果集。

http://www.w3schools.com/sql/sql_union.asp

您可以使用条件聚合:

SELECT  c.tp_name,
        Today = COUNT(CASE WHEN s.ExportDate > DATEADD(DAY,-1,@currentDay) THEN s.po_id END),
        LastYear = COUNT(CASE WHEN s.ExportDate > DATEADD(YEAR,-1,@currentDay) 
                            AND s.ExportDate < DATEADD(YEAR, -1,DATEADD(DAY, -1, @currentDay))THEN s.po_id END),
        TwoYear = COUNT(CASE WHEN s.ExportDate > DATEADD(YEAR,-2, @currentDay) 
                            AND s.ExportDate < DATEADD(YEAR, -2, DATEADD(DAY, -1, @currentDay))THEN s.po_id END),
FROM    [EDI_001].[dbo].[303v850h] as s
        JOIN [EDI_001].[dbo].[Trade] as c
            ON s.TP_PartID = c.TP_PartID
WHERE s.ExportDate < @currentDay AND
      s.ExportDate > DATEADD(YEAR, -2, DATEADD(DAY, -1, @currentDay))
GROUP BY c.tp_name
ORDER BY c.tp_name;

因此,您实际上是将每个WHERE子句移动到COUNT内的CASE语句中,因此您将仅对满足条件的记录进行计数。

DECLARE @currentDay DATETIME
SET     @currentDay = DATEDIFF(day,0,GETDATE()) -- Gives it 00:00:00.000 for time

SELECT  Sum(
            CASE 
            WHEN s.ExportDate Between DATEADD(day,-1,@currentDay) AND @currentDay 
            THEN 1 
            ELSE 0 
            END
            ) As Today,
        Sum(
            CASE 
            WHEN s.ExportDate Between DATEADD(year, -1,DATEADD(day,-1,@currentDay)) AND DATEADD(year,-1,@currentDay) 
            THEN 1 
            ELSE 0 
            END
            ) As LastYear,
        Sum(
            CASE 
            WHEN s.ExportDate Between DATEADD(year, -2,DATEADD(day,-1,@currentDay)) AND DATEADD(year,-2,@currentDay) 
            THEN 1 
            ELSE 0 
            END
            ) As TwoYear,
        c.tp_name
FROM    [EDI_001].[dbo].[303v850h] as s
JOIN    [EDI_001].[dbo].[Trade] as c
        on  s.TP_PartID = c.TP_PartID
GROUP   BY c.tp_name
ORDER   BY c.tp_name;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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