【问题标题】:Multiple selects in stored procedure using union - Noob使用联合在存储过程中进行多项选择 - Noob
【发布时间】:2013-04-10 06:22:02
【问题描述】:

我一直在寻找答案,但发现自己更加困惑。我没有那么有经验 - 但员工人数很少 - 只有我创建报告 - 我必须创建这个。

客户要求提供一份报告,该报告将返回关于存储在 2 个数据库中的调查问题的 MTD 答案。问题是 - 他们想要附加到每个提交的答案的记录,而不是调查的一部分。即每个受访者都有关于他们拥有的电话类型、居住区域、电话型号和服务天数的信息。 (虽然这些不是答案)

其中许多都是独一无二的。 (模型和城市)

例如,我在 SQL 中创建了一个存储过程来拉入 SSRS 以显示结果。

但每一个都是一个选择,我只得到第一个结果。我尝试添加UNION ALL,但是当我这样做时似乎并没有让我将它们分组。我将所有内容放在一列中,而我需要将它们放在单独的列中-理想情况下是水平的。但这可能要求太多了。

这是一个示例 - 也许有更快的方法 - 这是一个可怕的项目 - 我的截止日期现在快到了 - 我已经尝试了很多东西 - 并且正在搜索。除了寻求帮助,别无他法。

这就是我所拥有的-

ALTER PROCEDURE [dbo].[TEST_WIRELESS_DISCO_SURVEY_RESULTS]
(
   @STARTDATE DATETIME,
   @ENDDATE DATETIME
)
AS
BEGIN
   SELECT 
       a.CUSTOM17 as 'Make', COUNT(ISNULL(A.custom17, 0)) as 'Total Make'
   FROM GCI_SURVEYS as a
   JOIN GCI_Post_Survey_PreRepair_Master as b ON a.CustAcctNo = b.CustAcctNo
   WHERE b.Trans_Date between @STARTDATE and @ENDDATE
     AND a.i3_rowid = 'GCI_WRLSDISC_BSV'
     AND a.Q01 = 'no'
   GROUP BY  CUSTOM17

   UNION ALL

   SELECT 
       a.CUSTOM22 as 'Market', COUNT(ISNULL(a.CUSTOM22, 0)) as 'Total Market'
   FROM GCI_SURVEYS  as a
   JOIN GCI_Post_Survey_PreRepair_Master as b ON a.CustAcctNo = b.CustAcctNo
   WHERE b.Trans_Date between @STARTDATE  and @ENDDATE
     AND a.i3_rowid = 'GCI_WRLSDISC_BSV'
     AND a.Q01 = 'no'
   GROUP BY  a.CUSTOM22

【问题讨论】:

  • 你能显示你在这个查询后得到的结果吗
  • 尝试使用join而不是union。
  • 你能举个例子吗?
  • 运行后我得到以下 -
  • 运行后我得到以下信息 - 抱歉,这里的列没有排列(下) Make Total Make Apple 4 BLACKBERRY 4 COAM 11 LG 5 MOTOROLA 13 Nokia 3 Samsung 26 Verykool 7 Anchorage 38 Barrow 1 Bethel 10 Dillingham 3 Fairbanks 8 Juneau 2 Ketchikan 1 Kodiak 1 Kotzebue 1 Mat-Su 7 Nome Borough(减去 Nome)1 Wade Hampton 5

标签: sql-server stored-procedures reporting-services union


【解决方案1】:

根据您的解释,我认为联合的顶部和底部包含相同的调查,只是不同的部分?

我个人会将它们加载到可变表中(或者如果有很多记录,则为临时表),然后将它们连接在一起。

DECLARE @MakeQuestion TABLE
(
  survery_id INT --datatype
 ,make       VARCHAR(200) --replace with your own
 ,total_make INT
)

INSERT INTO @MakeQuestion
SELECT a.join_condition, a.CUSTOM17 as 'Make',COUNT(ISNULL(A.custom17,0)) as 'Total Make'
FROM GCI_SURVEYS as a
JOIN GCI_Post_Survey_PreRepair_Master as b
ON a.CustAcctNo = b.CustAcctNo
WHERE b.Trans_Date between @STARTDATE and @ENDDATE
AND a.i3_rowid = 'GCI_WRLSDISC_BSV'
AND a.Q01 = 'no'
GROUP BY  a.join_condition,CUSTOM17

DECLARE @MarketQuestion TABLE
(
  survery_id  INT -- datatype
 ,market        VARCHAR(200) --replace with your own
 ,total_market INT
)

Insert INTO @MarketQuestion
SELECT  a.join_condition, a.CUSTOM22 as 'Market',COUNT(ISNULL(a.CUSTOM22,0)) as 'Total Market'
FROM GCI_SURVEYS  as a
JOIN GCI_Post_Survey_PreRepair_Master as b
ON a.CustAcctNo = b.CustAcctNo
WHERE b.Trans_Date between @STARTDATE  and @ENDDATE
AND a.i3_rowid = 'GCI_WRLSDISC_BSV'
AND a.Q01 = 'no'
GROUP BY  a.CUSTOM22

SELECT *
FROM @MakeQuestion Make
INNER JOIN @MarketQuestion Market ON Make.survey_id = Market.survery_id

如果我误解了,请告诉我。

【讨论】:

  • 哦,哇,好的,我会试一试,看看会发生什么。谢谢!
  • 有没有办法让所有选择创建单独的列?像一个包装?我已经尝试过示例,但它一直要求声明标量变量 - Union 只是在一列中给出它。
【解决方案2】:

问题中,您说您正在从两个数据库中获取数据

返回存储在 2 个数据库中的调查问题的 MTD 答案

在你的 SP 中,你从同一个 DB

中选择

只需在您的Select Query 之一中添加数据库名称

【讨论】:

  • 抱歉我说错了 - 它是同一个数据库 - 我的意思是 2 个表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-03
  • 2013-10-12
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 2011-10-11
  • 1970-01-01
相关资源
最近更新 更多