Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 组合使用联合的结果集_Sql_Sql Server_Union - Fatal编程技术网

Sql 组合使用联合的结果集

Sql 组合使用联合的结果集,sql,sql-server,union,Sql,Sql Server,Union,我有使用联合的查询,我想将这些查询合并到一个结果集中。下面是示例查询。它返回两个结果集。我想把它们合并成一个。谢谢 问题1 SELECT COUNT(*) as 'Have you taken an interest/vocational assessment - Pre' FROM YESSCAYouth WHERE Assess2Pre1 = 1 UNION SELECT COUNT(*) FROM YESSCAYouth WHERE Assess2Pre1 = 2 UNION S

我有使用联合的查询,我想将这些查询合并到一个结果集中。下面是示例查询。它返回两个结果集。我想把它们合并成一个。谢谢

问题1

SELECT COUNT(*) as 'Have you taken an interest/vocational assessment - Pre'
  FROM YESSCAYouth
WHERE Assess2Pre1 = 1
UNION
SELECT COUNT(*)
  FROM YESSCAYouth
 WHERE Assess2Pre1 = 2
UNION
SELECT COUNT(*)
  FROM YESSCAYouth
 WHERE Assess2Pre1 = 3
UNION
SELECT COUNT(*)
  FROM YESSCAYouth
 WHERE Assess2Pre1 = 1 or Assess2Pre1 = 2 or Assess2Pre1 = 3
   AND Assess2PreDate BETWEEN CAST('01/01/2012' AS DATETIME) AND CAST('12/31/2012' AS DATETIME)
问题2

SELECT COUNT(*) as 'Have you taken an interest/vocational assessment - Post'
  FROM YESSCAYouth
 WHERE Assess2Post1 = 1
UNION
SELECT COUNT(*) 
  FROM YESSCAYouth
 WHERE Assess2Post1 = 2
UNION
SELECT COUNT(*)
  FROM YESSCAYouth
 WHERE Assess2Post1 = 3
UNION
SELECT COUNT(*) 
  FROM YESSCAYouth
 WHERE Assess2Post1 = 1 or Assess2Post1 = 2 or Assess2Post1 = 3
   AND Assess2PostDate BETWEEN CAST('01/01/2012' AS DATETIME) AND CAST('12/31/2012' AS DATETIME)

您只需将两个查询合并;在查询1和查询2的周围用括号括起来,并在中间放一个union子句,它将为您提供一个组合的结果集

(问题1)

联合

(问题2)

编辑:如果您有不同的列名,您可以尝试将其放入临时表并对其进行联合;试着在SQL管理工作室中运行这个,它会给你一个想法

select 'tt' as t, 'tete' as tt, 'tets' as ttt
into #test

select 'tt' as tre, 'tete' as tt, 'tets' as ttt
into #testt

select * from #test 
union 
select * from #testt

drop table #test
drop table #testt
我想你想要这样的东西:

select
   COALESCE(a1.Level,a2.Level) as Level,
   COALESCE(a1.Cnt,0) as 'Have you taken an interest/vocational assessment - Pre',
   COALESCE(a2.Cnt,0) as 'Have you taken an interest/vocational assessment - Post'
from
    (select Assess2Pre1,COUNT(*) from YESSCAYouth where Assess2Pre1 in (1,2,3) group by Assess2Pre1)
        a1(Level,Cnt)
            full outer join
    (select Assess2Post1,COUNT(*) from YESSCAYouth where Assess2Post1 in (1,2,3) group by Assess2Post1)
        a2(Level,Cnt)
            on
                a1.Level = a2.Level         
union all
select
    4,
    SUM(CASE WHEN Assess2Pre1 in (1,2,3) and Assess2PreDate between '20120101' and '20121231' THEN 1 END),
    SUM(CASE WHEN Assess2Post1 in (1,2,3) and Assess2PostDate between '20120101' and '20121231' THEN 1 END)
from YESSCAYouth
在上面,我对第二列和第三列进行了匹配,以便它们代表两个不同州的可比较结果。然后,我引入了一个union来引入基于日期的查询

如果这不是您想要的,请在您的问题中添加一些示例数据和预期结果。(我注意到,如果其中一个“级别”的前置和后置计数均为0,则我的上述查询将与您的查询不同)


其他注意事项:
in()
是一种真正的节省空间的方法,完全等同于
column=value1或column=value2…
。如果不使用
convert()
并指定显式格式,那么将
mm/dd/yyyy
转换为日期就不是一种安全的格式<另一方面,code>yyyymmdd将始终正确转换


最后,在名称中包含数字的列周围有一点设计的味道-这表明可能有其他相同的列具有相同的名称但数字不同-通常,正确的建模方法是引入一个列来保存该数字,并将数据存储为多行。

再次使用
UNION
有什么问题?将它们“组合”起来意味着什么。你不能使用另一个联合吗?我希望你知道,不能保证从上述查询返回结果的顺序?这样,给定您的查询,无法区分哪一行表示
COUNT(*)…其中Assess2Pre1=2
,哪一行表示
COUNT(*)…其中Assess2Pre1=3
…也不应该使用UNION。。。如果有两个查询的计数为3,则联合将消除一个。这不起作用。我创建第一个结果集,就像它现在添加到第二个结果集一样。UNION ALL将两者结合在一起进行计算……我明白了,要使UNION起作用,所有列必须是相同的;你的第一个专栏在“你是否对职业评估感兴趣-前”和“后”这两个栏目中有所不同结束,但我希望返回以下结果:您是否参加了兴趣/职业评估-0 17 47 64之前您是否参加了兴趣/职业评估-0 15 34之后49@Lakeshore-结果集中的列有一个名称(和一种类型)。您不能部分“重命名”列-因此我将结果放在两列中。
SELECT 1 as g, 'Have you taken an interest/vocational assessment - Pre' as x

UNION ALL 

SELECT 2 as g, cast(COUNT (1) as varchar) as x --as 'Have you taken an interest/vocational assessment - Pre'
FROM YESSCAYouth 
WHERE Assess2Pre1 = 1

UNION ALL

SELECT 3 as g, cast(COUNT (1) as varchar) as x FROM YESSCAYouth
WHERE Assess2Pre1 = 2

UNION ALL

SELECT 4 as g, cast(COUNT (1) as varchar) as x FROM YESSCAYouth
WHERE Assess2Pre1 = 3

UNION ALL

SELECT 5 as g, cast(COUNT (1) as varchar) as x FROM YESSCAYouth
WHERE Assess2Pre1 = 1 or Assess2Pre1 = 2 or Assess2Pre1 = 3
AND
Assess2PreDate 
BETWEEN CAST('01/01/2012' AS DATETIME) AND CAST('12/31/2012' AS DATETIME)

UNION ALL
--QUERY 2 ****************************************

SELECT
6 as g, 'Have you taken an interest/vocational assessment - Post'

UNION
ALL 

SELECT
7 as g,cast(COUNT (1) as varchar) as x --as 'Have you taken an interest/vocational assessment - Post'
FROM
YESSCAYouth
WHERE
Assess2Post1 = 1

UNION
ALL

SELECT
8 as g, cast(COUNT (1) as varchar) as x FROM YESSCAYouth
WHERE
Assess2Post1 = 2

UNION
ALL

SELECT
9 as g, cast(COUNT (1) as varchar) as x FROM YESSCAYouth
WHERE
Assess2Post1 = 3

UNION
ALL

SELECT
10 as g, cast(COUNT (1) as varchar) as x FROM YESSCAYouth
WHERE
Assess2Post1 = 1 or Assess2Post1 = 2 or Assess2Post1 = 3
AND
Assess2PreDate 
BETWEEN CAST('01/01/2012' AS DATETIME) AND CAST('12/31/2012' AS DATETIME)
ORDER
BY g