0

SELECTクエリを使用してテーブルの値を統合したいと思います。私のテーブルには5つの列があります:名前、日付[最大3つの日付(連続した営業日)]、および各日の3つの値。

次のような出力が必要です: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:質問にぴったりのタイトルが見つかりませんでした。お気軽に編集してください。

4

3 に答える 3

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

于 2012-06-15T13:27:34.117 に答える
2

あなたのデータはあなたの説明と完全に一致していないので、代わりにあなたの説明に行きます。

また、SQLServer2005以降を想定しています。

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
于 2012-06-15T13:28:02.677 に答える
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)
于 2012-06-15T14:13:38.553 に答える