سلام
برای اینکه یه همچینی گزارشی رو بسازی٬میتونی افزونگی داده رو در بانک اطلاعاتی نادیده بگیری (این کار در بعضی از سیستمها اعمال میشه) و جدول رو جوری طراحی کنی تا بتونی به نیازهای کاربران با سرعت بیشتری پاسخ بدی.
ببین افزونگی داده نداشتن در بانک برات مهم تره یا سرعت پاسخ دادن به مشتریها در حجمهای بالای داده هات.
خوب اگه بی خیال افزونگی شده بگو تا برای این مورد کمکت کنم.
البته راههای دیگه ای هم مثل انباره داده ها٬ olap و ...هم برای انجام کارات هستش که بعید می دونم بتونی پیاده سازی و استفاده کنی.
این کد رو هم یه نگاهی بنداز و اجراش کن
CREATE TABLE [dbo].[Table1] (
[id] [numeric](18, 0) NOT NULL ,
[name] [char] (10) COLLATE Arabic_CI_AS NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[Table2] (
[id] [numeric](18, 0) NOT NULL,
[id_b] [numeric](18, 0) NULL ,
[id_s] [numeric](18, 0) NULL ,
[sahm_b] [numeric](18, 0) NULL ,
[sahm_s] [numeric](18, 0) NULL ,
[id_to_from] [numeric](18, 0) NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Table1] WITH NOCHECK ADD
CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Table2] WITH NOCHECK ADD
CONSTRAINT [PK_Table2] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Table2] ADD
CONSTRAINT [FK_Table2_Table1] FOREIGN KEY
(
[id_b]
) REFERENCES [dbo].[Table1] (
[id]
),
CONSTRAINT [FK_Table2_Table11] FOREIGN KEY
(
[id_s]
) REFERENCES [dbo].[Table1] (
[id]
),
CONSTRAINT [FK_Table2_Table12] FOREIGN KEY
(
[id_to_from]
) REFERENCES [dbo].[Table1] (
[id]
)
GO
INSERT INTO TABLE1 VALUES(1,'ALI')
INSERT INTO TABLE1 VALUES(2,'REZA')
INSERT INTO TABLE1 VALUES(3,'YASER')
INSERT INTO TABLE1 VALUES(4,'HADI')
GO
INSERT INTO TABLE2 VALUES(1, NULL, 1, NULL, 100, 2)
INSERT INTO TABLE2 VALUES(2, 2, NULL, 100, NULL, 1)
INSERT INTO TABLE2 VALUES(3, NULL, 2, NULL, 50, 1)
INSERT INTO TABLE2 VALUES(4, 1, NULL, 50, NULL, 2)
INSERT INTO TABLE2 VALUES(5, NULL, 3, NULL, 70, 1)
INSERT INTO TABLE2 VALUES(6, 1, NULL, 70, NULL, 3)
GO
SELECT
LTRIM(RTRIM(
CASE
WHEN (SELECT NAME FROM TABLE1 T1 WHERE T1.ID = T2.ID_B) IS NOT NULL THEN (SELECT NAME FROM TABLE1 T1 WHERE T1.ID = T2.ID_B)
ELSE ''
END
+ CASE
WHEN (SELECT NAME FROM TABLE1 T1 WHERE T1.ID = T2.ID_S) IS NOT NULL THEN (SELECT NAME FROM TABLE1 T1 WHERE T1.ID = T2.ID_S)
ELSE ''
END
)) AS 'معامله کننده'
, CASE
WHEN SAHM_B IS NOT NULL THEN SAHM_B
ELSE NULL
END AS 'تعداد سهم خریداری شده'
, CASE
WHEN SAHM_S IS NOT NULL THEN SAHM_S
ELSE NULL
END AS 'تعداد سهم فروخته شده'
, (SELECT NAME FROM TABLE1 T1 WHERE T1.ID = T2.ID_TO_FROM) AS 'از/به چه کسی'
FROM TABLE2 T2
ORDER BY 'معامله کننده'
امیدورام بدردت بخوره.