在SQL select中进行计算

时间:2012-06-15 13:20:36

标签: sql sql-server select

我想使用SELECT Query合并表格中的值。 我的表有5列:名称,日期[最多三个日期(连续商业日)],每天有三个值。

我想要输出如下: strName,来自Date0的SUM(Value1 + Value2 - Value3),来自Date1的SUM(Value1 + Value2 - Value3),来自Date2的SUM(Value1 + Value2 - Value3)。

输入:

strName myDate  Value1  Value2  Value3
X4  2012-06-14  26300   0   0
X4  2012-06-15  0   4000    0
X4  2012-06-18  0   5600    0
X9  2012-06-14  764 0   0
A3  2012-06-14  7850    0   0
B   2012-06-14  5500    0   0
C3  2012-06-14  269100  0   0
D3  2012-06-14  395100  0   0
D3  2012-06-15  0   0   500

理想输出:

X4, 26300, 4000,5600
X9, 760, 0, 0
A3, 7850
...
D3, 395100, 0, -500

我的表:

USE [MyTestBD]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[tbX](
[strName] [varchar](max) NOT NULL,
[Value1] [float] NOT NULL,
[myDate] [date] NOT NULL,
[Value2] [float] NOT NULL,
[Value3] [float] NOT NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[tbX] ([strName], [Value1], [myDate], [Value2], [Value3]) VALUES (N'X4', 26300, CAST(0xCB350B00 AS Date), 0, 0)
INSERT [dbo].[tbX] ([strName], [Value1], [myDate], [Value2], [Value3]) VALUES (N'X4', 0, CAST(0xCC350B00 AS Date), 4000, 0)
INSERT [dbo].[tbX] ([strName], [Value1], [myDate], [Value2], [Value3]) VALUES (N'X4', 0, CAST(0xCF350B00 AS Date), 5600, 0)
INSERT [dbo].[tbX] ([strName], [Value1], [myDate], [Value2], [Value3]) VALUES (N'X9', 764, CAST(0xCB350B00 AS Date), 0, 0)
INSERT [dbo].[tbX] ([strName], [Value1], [myDate], [Value2], [Value3]) VALUES (N'A3', 7850, CAST(0xCB350B00 AS Date), 0, 0)
INSERT [dbo].[tbX] ([strName], [Value1], [myDate], [Value2], [Value3]) VALUES (N'B', 5500, CAST(0xCB350B00 AS Date), 0, 0)
INSERT [dbo].[tbX] ([strName], [Value1], [myDate], [Value2], [Value3]) VALUES (N'C3', 269100, CAST(0xCB350B00 AS Date), 0, 0)
INSERT [dbo].[tbX] ([strName], [Value1], [myDate], [Value2], [Value3]) VALUES (N'D3', 395100, CAST(0xCB350B00 AS Date), 0, 0)
INSERT [dbo].[tbX] ([strName], [Value1], [myDate], [Value2], [Value3]) VALUES (N'D3', 0, CAST(0xCC350B00 AS Date), 0, 500)
INSERT [dbo].[tbX] ([strName], [Value1], [myDate], [Value2], [Value3]) VALUES (N'D4', 400, CAST(0xCB350B00 AS Date), 0, 0)
INSERT [dbo].[tbX] ([strName], [Value1], [myDate], [Value2], [Value3]) VALUES (N'D4', 0, CAST(0xCC350B00 AS Date), 400, 6600)
INSERT [dbo].[tbX] ([strName], [Value1], [myDate], [Value2], [Value3]) VALUES (N'E3', 361349, CAST(0xCB350B00 AS Date), 0, 0)
INSERT [dbo].[tbX] ([strName], [Value1], [myDate], [Value2], [Value3]) VALUES (N'F6', 45500, CAST(0xCB350B00 AS Date), 0, 0)
INSERT [dbo].[tbX] ([strName], [Value1], [myDate], [Value2], [Value3]) VALUES (N'F6', 0, CAST(0xCC350B00 AS Date), 11600, 0)
INSERT [dbo].[tbX] ([strName], [Value1], [myDate], [Value2], [Value3]) VALUES (N'G4', 55979, CAST(0xCB350B00 AS Date), 0, 0)
INSERT [dbo].[tbX] ([strName], [Value1], [myDate], [Value2], [Value3]) VALUES (N'G4', 0, CAST(0xCC350B00 AS Date), 0, 19100)
INSERT [dbo].[tbX] ([strName], [Value1], [myDate], [Value2], [Value3]) VALUES (N'G4', 0, CAST(0xCF350B00 AS Date), 0, 38300)
PS:我没有为我的问题找到一个很好的标题。随意编辑它。

3 个答案:

答案 0 :(得分:4)

试试这个:

SELECT
    strName,
    SUM(CASE rn WHEN 1 THEN Value1 + Value2 - Value3 END),
    SUM(CASE rn WHEN 2 THEN Value1 + Value2 - Value3 END),
    SUM(CASE rn WHEN 3 THEN Value1 + Value2 - Value3 END)
FROM
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY strName ORDER BY mydate) AS rn
    FROM tbX
) AS T1

结果:

A3  7850        (null)  (null)
B   5500        (null)  (null)
C3  269100      (null)  (null)
D3  395100      -500    (null)
D4  400         -6200   (null)
E3  361349      (null)  (null)
F6  45500       11600   (null)
G4  55979       -19100  -38300
X4  26300       4000    5600
X9  764         (null)  (null)

sqlfiddle

答案 1 :(得分:2)

您的数据与您的解释并不完全一致,所以我会改为解释您的解释。

我还假设SQL Server 2005或更好。

WITH
  sequenced_data
AS
(
  SELECT
    ROW_NUMBER() OVER (PARTITION BY strName ORDER BY MyDate) AS sequence_id,
    *
  FROM
    tbX
)
SELECT
  strName,
  SUM(CASE WHEN sequence_id = 1 THEN value1 + value2 - value3 ELSE 0 END) AS v1,
  SUM(CASE WHEN sequence_id = 2 THEN value1 + value2 - value3 ELSE 0 END) AS v2,
  SUM(CASE WHEN sequence_id = 3 THEN value1 + value2 - value3 ELSE 0 END) AS v3
FROM
  sequenced_data
GROUP BY
  strName

答案 2 :(得分:1)

在您的测试数据中,您有3个日期,因此您可以编写2个案例。 如果你打算增加日期的多样性,这个动态支点可能会有用

declare @col varchar(1000)
declare @sql varchar(2000)

select @col = COALESCE(@col + ', ','') + QUOTENAME(myDate) from (select distinct myDate from tbX) t

select @col

set @sql = 'select strName, ' + @col + '
from ( SELECT [strName],myDate,sum(Value1+Value2-Value3) as suma FROM tbX group by [strName],myDate)p
PIVOT(sum(suma) FOR myDate IN ( ' + @col + ' )
) AS pvt'

print @sql

exec (@sql)