SQL存储过程将UNION行合并为1行

时间:2016-10-26 10:42:07

标签: sql sql-server tsql

我很想知道如何将此查询的结果放入一行而不是它返回的3行:

SELECT COUNT([fms].[dbo].[Booking].BOOKINGNUMBER) FROM [fms].[dbo].[Booking]
INNER JOIN [fms].[dbo].[Container] ON [fms].[dbo].[Booking].[BOOKINGNUMBER] = [fms].[dbo].[Container].[BOOKINGNUMBER]
INNER JOIN [fms].[dbo].[File] ON [fms].[dbo].[Container].FILENUMBER = [fms].[dbo].[File].FILENUMBER
WHERE [fms].[dbo].[Booking].RELATIONCODE = 'SHIP02' AND [fms].[dbo].[File].ETA BETWEEN '2000-10-27' AND '2016-10-28'

UNION ALL

SELECT COUNT([fmsAir].[dbo].[Booking].BOOKINGNUMBER) FROM [fmsAir].[dbo].[Booking]
INNER JOIN [fmsAir].[dbo].[Container] ON [fmsAir].[dbo].[Booking].[BOOKINGNUMBER] = [fmsAir].[dbo].[Container].[BOOKINGNUMBER]
INNER JOIN [fmsAir].[dbo].[File] ON [fmsAir].[dbo].[Container].FILENUMBER = [fmsAir].[dbo].[File].FILENUMBER
WHERE [fmsAir].[dbo].[Booking].RELATIONCODE = 'SHIP02' AND [fmsAir].[dbo].[File].ETA BETWEEN '2000-10-27' AND '2016-10-28'

UNION ALL

SELECT COUNT([fmsProjects].[dbo].[Booking].BOOKINGNUMBER) FROM [fmsProjects].[dbo].[Booking]
INNER JOIN [fmsProjects].[dbo].[Container] ON [fmsProjects].[dbo].[Booking].[BOOKINGNUMBER] = [fmsProjects].[dbo].[Container].[BOOKINGNUMBER]
INNER JOIN [fmsProjects].[dbo].[File] ON [fmsProjects].[dbo].[Container].FILENUMBER = [fmsProjects].[dbo].[File].FILENUMBER
WHERE [fmsProjects].[dbo].[Booking].RELATIONCODE = 'SHIP02' AND [fmsProjects].[dbo].[File].ETA BETWEEN '2000-10-27' AND '2016-10-28'

有没有办法可以组合3个结果行并将它们计算为1行。我在存储过程中使用它。

3 个答案:

答案 0 :(得分:1)

如果你想要汇总所有3个SELECT查询的所有计数,你可以这样:

SELECT SUM(cnt)
FROM(
   SELECT COUNT([fms].[dbo].[Booking].BOOKINGNUMBER) cnt
   FROM [fms].[dbo].[Booking]
   INNER JOIN [fms].[dbo].[Container] ON [fms].[dbo].[Booking].[BOOKINGNUMBER] = [fms].[dbo].[Container].[BOOKINGNUMBER]
   INNER JOIN [fms].[dbo].[File] ON [fms].[dbo].[Container].FILENUMBER = [fms].[dbo].[File].FILENUMBER
   WHERE [fms].[dbo].[Booking].RELATIONCODE = 'SHIP02' AND [fms].[dbo].[File].ETA BETWEEN '2000-10-27' AND '2016-10-28'
   UNION ALL
   SELECT COUNT([fmsAir].[dbo].[Booking].BOOKINGNUMBER) 
   FROM [fmsAir].[dbo].[Booking]
   INNER JOIN [fmsAir].[dbo].[Container] ON [fmsAir].[dbo].[Booking].[BOOKINGNUMBER] = [fmsAir].[dbo].[Container].[BOOKINGNUMBER]
   INNER JOIN [fmsAir].[dbo].[File] ON [fmsAir].[dbo].[Container].FILENUMBER = [fmsAir].[dbo].[File].FILENUMBER
   WHERE [fmsAir].[dbo].[Booking].RELATIONCODE = 'SHIP02' AND [fmsAir].[dbo].[File].ETA BETWEEN '2000-10-27' AND '2016-10-28'
   UNION ALL
   SELECT COUNT([fmsProjects].[dbo].[Booking].BOOKINGNUMBER) 
   FROM [fmsProjects].[dbo].[Booking]
   INNER JOIN [fmsProjects].[dbo].[Container] ON [fmsProjects].[dbo].[Booking].[BOOKINGNUMBER] = [fmsProjects].[dbo].[Container].[BOOKINGNUMBER]
   INNER JOIN [fmsProjects].[dbo].[File] ON [fmsProjects].[dbo].[Container].FILENUMBER = [fmsProjects].[dbo].[File].FILENUMBER
   WHERE [fmsProjects].[dbo].[Booking].RELATIONCODE = 'SHIP02' AND [fmsProjects].[dbo].[File].ETA BETWEEN '2000-10-27' AND '2016-10-28'
) AS tmp;

答案 1 :(得分:0)

这是一种方式

SELECT (SELECT Count([fms].[dbo].[Booking].BOOKINGNUMBER)
        FROM   [fms].[dbo].[Booking]
               .......
        WHERE  [fms].[dbo].[Booking].RELATIONCODE = 'SHIP02'
               AND [fms].[dbo].[File].ETA BETWEEN '2000-10-27' AND '2016-10-28') as fms_count,
       (SELECT Count([fmsAir].[dbo].[Booking].BOOKINGNUMBER)
        FROM   [fmsAir].[dbo].[Booking] 
               .......
        WHERE  [fmsAir].[dbo].[Booking].RELATIONCODE = 'SHIP02'
               AND [fmsAir].[dbo].[File].ETA BETWEEN '2000-10-27' AND '2016-10-28') as fmsAir_count,
       (SELECT Count([fmsProjects].[dbo].[Booking].BOOKINGNUMBER)
        FROM   [fmsProjects].[dbo].[Booking]
               .....
        WHERE  [fmsProjects].[dbo].[Booking].RELATIONCODE = 'SHIP02'
               AND [fmsProjects].[dbo].[File].ETA BETWEEN '2000-10-27' AND '2016-10-28') as fmsProjects_count

答案 2 :(得分:0)

谁可以阅读这样的查询?使用表别名!

SELECT COUNT(b.BOOKINGNUMBER) 
FROM [fms].[dbo].[Booking] b INNER JOIN
     [fms].[dbo].[Container] c
     ON b.[BOOKINGNUMBER] = c.[BOOKINGNUMBER] INNER JOIN
     [fms].[dbo].[File] f
     ON [c.FILENUMBER = f.FILENUMBER
WHERE b.RELATIONCODE = 'SHIP02' AND [f.ETA BETWEEN '2000-10-27' AND '2016-10-28';

至于将它们放在一行中,一种方法就是使用子查询:

SELECT (SELECT COUNT(b.BOOKINGNUMBER) 
        FROM [fms].[dbo].[Booking] b INNER JOIN
             [fms].[dbo].[Container] c
             ON b.[BOOKINGNUMBER] = c.[BOOKINGNUMBER] INNER JOIN
             [fms].[dbo].[File] f
             ON [c.FILENUMBER = f.FILENUMBER
        WHERE b.RELATIONCODE = 'SHIP02' AND [f.ETA BETWEEN '2000-10-27' AND '2016-10-28'
       ) as fms_count,
       (SELECT COUNT(b.BOOKINGNUMBER) 
        FROM [fmsair].[dbo].[Booking] b INNER JOIN
             [fmsair].[dbo].[Container] c
             ON b.[BOOKINGNUMBER] = c.[BOOKINGNUMBER] INNER JOIN
             [fmsair].[dbo].[File] f
             ON [c.FILENUMBER = f.FILENUMBER
        WHERE b.RELATIONCODE = 'SHIP02' AND [f.ETA BETWEEN '2000-10-27' AND '2016-10-28'
       ) as fmsair_count,
       (SELECT COUNT(b.BOOKINGNUMBER) 
        FROM [fmsprojects].[dbo].[Booking] b INNER JOIN
             [fmsprojects].[dbo].[Container] c
             ON b.[BOOKINGNUMBER] = c.[BOOKINGNUMBER] INNER JOIN
             [fmsprojects].[dbo].[File] f
             ON [c.FILENUMBER = f.FILENUMBER
        WHERE b.RELATIONCODE = 'SHIP02' AND [f.ETA BETWEEN '2000-10-27' AND '2016-10-28'
       ) as fmsprojects_count