如何sql查询以获得正确的值

时间:2015-05-06 10:41:49

标签: sql sql-server

我有大约24个表(JanSales13 - DecSales14),每个月的列完全相同。 我希望能够动态地或者可选地加入每个表。这是动态选择表格(例如,FebSales13& JulySales13或DecSales13& AprilSales14)。 首先,我需要union所选/选定的表格。 在union运算符组合这些表之后,我想选择一些列,然后聚合它们的事务数据。 逻辑:能够选择任何两个表。然后表格应合并为一个。在UNION运算符之后,获取联合表的记录

这就是我到目前为止所拥有的。动态联合表。用户应该能够选择任何表格:

CREATE PROC spCombine
   @Table_Name  sysname,
   @Table_Name2  sysname
AS
BEGIN
  SET NOCOUNT OFF;

DECLARE @Dynamictbl nvarchar(MAX)

SET @Dynamictbl = 
N'SELECT * FROM ' + @Table_Name +
' UNION
SELECT * FROM ' + @Table_Name2

EXECUTE sp_executesql @Dynamictbl

END

这两个表结合后应执行粗略查询

    SELECT
 Product, Description,
 Sum(A_Sales ) AS [A_salesFeb],
 Sum(A_Sales ) AS [A_salesMay],
 Sum(A_Sales ) AS [B_salesFeb],
 Sum(A_Sales ) AS [B_salesMay],
 Sum(A_Sales ) AS [C_salesFeb],
 Sum(A_Sales ) AS [C_salesMay],
FROM ……
GROUP BY Product, Description

所以我的期望是如果我执行商店程序,则会发生以下三个步骤

EXEC spCombine @Table_Name =’ FebSales13’, @Table_Name2=’ MaySales13’
  1. 选择任意两个表格
  2. 将它们组合在一起
  3. 主要查询的结果
  4. 图形图像: enter image description here

3 个答案:

答案 0 :(得分:1)

您的WHERE条款

有问题
select  [TP], 
        sum(Amount1) as Amount1_02,
        sum(Amount1) as Amount1_03,
        sum(Amount2) as Amount2_02,
        sum(Amount2) as Amount1_03
 from [dbo].[tbl1]
 where Date = '01.02.2011' 
 OR 
 Date = '01.03.2015'
 group by [TP]

答案 1 :(得分:1)

您需要条件聚合。像CASE这样使用SUM

select  [TP], 
SUM(CASE WHEN Date = '01.02.2011' THEN Amount1 END) as Amount1_02,
SUM(CASE WHEN Date = '01.03.2011' THEN Amount1 END) as Amount1_03,
SUM(CASE WHEN Date = '01.02.2011' THEN Amount2 END) as Amount2_02,
SUM(CASE WHEN Date = '01.03.2011' THEN Amount2 END) as Amount1_03
FROM [dbo].[tbl1]
WHERE Date = '01.02.2011'
OR Date = '01.02.2011'
GROUP BY [TP]

答案 2 :(得分:1)

使用CASESUM正确的值:

select [TP], 
       sum(case when date = '02.2011' then Amount1 end) as Amount1_02,
       sum(case when date = '03.2011' then Amount1 end) as Amount1_03,
       sum(case when date = '02.2011' then Amount2 end) as Amount2_02,
       sum(case when date = '03.2011' then Amount2 end) as Amount1_03
from [dbo].[tbl1]
where Date = '02.2011' OR Date = '03.2015'
group by [TP]