我可以使用 CTE 将这两个表合二为一吗?
Can I use a CTE to make these two tables become one?
有什么方法可以使这两个查询成为一个查询吗?我需要所有这些都在一个 table 中。目前我没有使用任何常见的 table 表达式,我相信如果我使用它们,我可以将这两个代码合并为一个 table.
我还想要一个名为 'G' 的列,它是 'E' 和 'F'
的总和
有什么方法可以将这两个查询合二为一吗?
这是我的两个单独查询的代码:
DECLARE @Results TABLE
(
Code NVARCHAR(20),
Name NVARCHAR(100),
EFFECTIVEDATE DATE,
Reference NVARCHAR(20),
RATE Decimal(3,2)
)
INSERT INTO @Results
SELECT
TP.Reference AS [Code],
TP.NAME AS [Name],
FORMAT(D.StartDate,'yyyy-MM-dd') AS [EFFECTIVEDATE],
D.Reference AS [Reference],
DR.Rate AS [RATE]
FROM TradingP TP
RIGHT JOIN Schema S on S.TradingPId = TP.Id
RIGHT JOIN Deals D ON D.SchemaId = S.Id
LEFT JOIN DealResults DR on D.Id = DR.DealId
LEFT JOIN DealTurnoverBands DTR ON D.Id = DTR.DealId
SELECT
[Code] 'Supplier Code',
[Name] 'Supplier',
[EFFECTIVEDATE] 'Effective Date',
[A] 'A %',
[B] 'B %',
[C] 'C %',
[D] 'D %',
[E] 'E %'
FROM @Results
PIVOT (
MAX(RATE)
FOR
Reference IN ([A], [B], [C], [D], [E])
)
as pivottable1
DECLARE @Results TABLE
(
Code NVARCHAR(20),
Name NVARCHAR(100),
EFFECTIVEDATE DATE,
Reference NVARCHAR(20),
RATE Decimal(3,2)
)
INSERT INTO @Results
SELECT
TP.Reference AS [Code],
TP.NAME AS [Name],
FORMAT(D.StartDate,'yyyy-MM-dd') AS [EFFECTIVEDATE],
D.Reference AS [Reference],
DTB.PercentageRate AS [RATE]
FROM TradingPartners TP
RIGHT JOIN Schemes S on S.TradingPartnerId = TP.Id
RIGHT JOIN Deals D ON D.SchemeId = S.Id
LEFT JOIN DealTurnoverBands DTB ON D.Id = DTB.DealId
WHERE PercentageRate IS NOT NULL AND PercentageRate >0.1
SELECT
[Code] 'Supplier Code',
[Name] 'Supplier',
[EFFECTIVEDATE] 'Effective Date',
[F] 'F %'
FROM @Results
PIVOT (
MAX(RATE)
FOR
Reference IN ([F])
)
as pivottable1
```
您不需要 CTE;只需将两组数据插入您的 table 变量即可。
此外,您应该避免将 datetime
值转换为字符串只是为了删除时间部分;只需将其转换为 date
.
并且如果您要测试 PercentageRate
大于 0.1
的记录,则不需要同时测试 PercentageRate
是否为 NOT NULL
; NULL
值不会通过 greater-than 测试。
DECLARE @Results TABLE
(
Code NVARCHAR(20),
Name NVARCHAR(100),
EFFECTIVEDATE DATE,
Reference NVARCHAR(20),
RATE Decimal(3,2)
);
INSERT INTO @Results
(
Code,
Name,
EFFECTIVEDATE,
Reference,
RATE
)
SELECT
TP.Reference AS [Code],
TP.NAME AS [Name],
CAST(D.StartDate As date) AS [EFFECTIVEDATE],
D.Reference AS [Reference],
DR.Rate AS [RATE]
FROM
TradingP TP
RIGHT JOIN Schema S on S.TradingPId = TP.Id
RIGHT JOIN Deals D ON D.SchemaId = S.Id
LEFT JOIN DealResults DR on D.Id = DR.DealId
LEFT JOIN DealTurnoverBands DTR ON D.Id = DTR.DealId
WHERE
TP.Reference IN ('A', 'B', 'C', 'D', 'E')
;
INSERT INTO @Results
(
Code,
Name,
EFFECTIVEDATE,
Reference,
RATE
)
SELECT
TP.Reference AS [Code],
TP.NAME AS [Name],
CAST(D.StartDate As date) AS [EFFECTIVEDATE],
D.Reference AS [Reference],
DTB.PercentageRate AS [RATE]
FROM
TradingPartners TP
RIGHT JOIN Schemes S on S.TradingPartnerId = TP.Id
RIGHT JOIN Deals D ON D.SchemeId = S.Id
LEFT JOIN DealTurnoverBands DTB ON D.Id = DTB.DealId
WHERE
TP.Reference = 'F'
And
DTB.PercentageRate > 0.1
;
SELECT
[Code] 'Supplier Code',
[Name] 'Supplier',
[EFFECTIVEDATE] 'Effective Date',
[A] 'A %',
[B] 'B %',
[C] 'C %',
[D] 'D %',
[E] 'E %',
[F] 'F %',
[E] + [F] 'G %'
FROM
@Results
PIVOT
(
MAX(RATE)
FOR Reference IN ([A], [B], [C], [D], [E], [F])
) As pivottable1
;
只是说,“通用 Table 表达式”或 CTE 就像是 sub-query 的 re-usable 模板。
例如,这个查询:
WITH CTE_DATA AS (select * from tableA)
SELECT * FROM CTE_DATA AS data;
Returns 与此查询完全相同:
SELECT * FROM (select * from tableA) AS data;
但是要合并这两个查询,您只需将它们合并到数据透视表的源查询中即可。
WITH CTE1 AS (
SELECT
TP.Reference AS [Code],
TP.NAME AS [Name],
FORMAT(D.StartDate,'yyyy-MM-dd') AS [EFFECTIVEDATE],
D.Reference AS [Reference],
DR.Rate AS [RATE]
FROM TradingP TP
RIGHT JOIN Schema S on S.TradingPId = TP.Id
RIGHT JOIN Deals D ON D.SchemaId = S.Id
LEFT JOIN DealResults DR on D.Id = DR.DealId
LEFT JOIN DealTurnoverBands DTR ON D.Id = DTR.DealId
WHERE D.Reference IN ('A', 'B', 'C', 'D', 'E')
)
, CTE2 AS (
SELECT
TP.Reference AS [Code],
TP.NAME AS [Name],
FORMAT(D.StartDate,'yyyy-MM-dd') AS [EFFECTIVEDATE],
D.Reference AS [Reference],
DTB.PercentageRate
FROM TradingPartners TP
RIGHT JOIN Schemes S on S.TradingPartnerId = TP.Id
RIGHT JOIN Deals D ON D.SchemeId = S.Id
LEFT JOIN DealTurnoverBands DTB ON D.Id = DTB.DealId
WHERE D.Reference IN ('F')
AND DBT.PercentageRate > 0.1
)
SELECT
[Code] AS [Supplier Code],
[Name] AS [Supplier],
[EFFECTIVEDATE] AS [Effective Date],
[A] AS [A %],
[B] AS [B %],
[C] AS [C %],
[D] AS [D %],
[E] AS [E %],
[F] AS [F %]
FROM (
SELECT Code, Name, EFFECTIVEDATE
, Reference
, RATE
FROM CTE1
UNION ALL
SELECT Code, Name, EFFECTIVEDATE
, Reference
, PercentageRate
FROM CTE2
) Src
PIVOT (
MAX(RATE)
FOR Reference IN ([A], [B], [C], [D], [E], [F])
) Pvt;
有什么方法可以使这两个查询成为一个查询吗?我需要所有这些都在一个 table 中。目前我没有使用任何常见的 table 表达式,我相信如果我使用它们,我可以将这两个代码合并为一个 table.
我还想要一个名为 'G' 的列,它是 'E' 和 'F'
的总和有什么方法可以将这两个查询合二为一吗?
这是我的两个单独查询的代码:
DECLARE @Results TABLE
(
Code NVARCHAR(20),
Name NVARCHAR(100),
EFFECTIVEDATE DATE,
Reference NVARCHAR(20),
RATE Decimal(3,2)
)
INSERT INTO @Results
SELECT
TP.Reference AS [Code],
TP.NAME AS [Name],
FORMAT(D.StartDate,'yyyy-MM-dd') AS [EFFECTIVEDATE],
D.Reference AS [Reference],
DR.Rate AS [RATE]
FROM TradingP TP
RIGHT JOIN Schema S on S.TradingPId = TP.Id
RIGHT JOIN Deals D ON D.SchemaId = S.Id
LEFT JOIN DealResults DR on D.Id = DR.DealId
LEFT JOIN DealTurnoverBands DTR ON D.Id = DTR.DealId
SELECT
[Code] 'Supplier Code',
[Name] 'Supplier',
[EFFECTIVEDATE] 'Effective Date',
[A] 'A %',
[B] 'B %',
[C] 'C %',
[D] 'D %',
[E] 'E %'
FROM @Results
PIVOT (
MAX(RATE)
FOR
Reference IN ([A], [B], [C], [D], [E])
)
as pivottable1
DECLARE @Results TABLE
(
Code NVARCHAR(20),
Name NVARCHAR(100),
EFFECTIVEDATE DATE,
Reference NVARCHAR(20),
RATE Decimal(3,2)
)
INSERT INTO @Results
SELECT
TP.Reference AS [Code],
TP.NAME AS [Name],
FORMAT(D.StartDate,'yyyy-MM-dd') AS [EFFECTIVEDATE],
D.Reference AS [Reference],
DTB.PercentageRate AS [RATE]
FROM TradingPartners TP
RIGHT JOIN Schemes S on S.TradingPartnerId = TP.Id
RIGHT JOIN Deals D ON D.SchemeId = S.Id
LEFT JOIN DealTurnoverBands DTB ON D.Id = DTB.DealId
WHERE PercentageRate IS NOT NULL AND PercentageRate >0.1
SELECT
[Code] 'Supplier Code',
[Name] 'Supplier',
[EFFECTIVEDATE] 'Effective Date',
[F] 'F %'
FROM @Results
PIVOT (
MAX(RATE)
FOR
Reference IN ([F])
)
as pivottable1
```
您不需要 CTE;只需将两组数据插入您的 table 变量即可。
此外,您应该避免将 datetime
值转换为字符串只是为了删除时间部分;只需将其转换为 date
.
并且如果您要测试 PercentageRate
大于 0.1
的记录,则不需要同时测试 PercentageRate
是否为 NOT NULL
; NULL
值不会通过 greater-than 测试。
DECLARE @Results TABLE
(
Code NVARCHAR(20),
Name NVARCHAR(100),
EFFECTIVEDATE DATE,
Reference NVARCHAR(20),
RATE Decimal(3,2)
);
INSERT INTO @Results
(
Code,
Name,
EFFECTIVEDATE,
Reference,
RATE
)
SELECT
TP.Reference AS [Code],
TP.NAME AS [Name],
CAST(D.StartDate As date) AS [EFFECTIVEDATE],
D.Reference AS [Reference],
DR.Rate AS [RATE]
FROM
TradingP TP
RIGHT JOIN Schema S on S.TradingPId = TP.Id
RIGHT JOIN Deals D ON D.SchemaId = S.Id
LEFT JOIN DealResults DR on D.Id = DR.DealId
LEFT JOIN DealTurnoverBands DTR ON D.Id = DTR.DealId
WHERE
TP.Reference IN ('A', 'B', 'C', 'D', 'E')
;
INSERT INTO @Results
(
Code,
Name,
EFFECTIVEDATE,
Reference,
RATE
)
SELECT
TP.Reference AS [Code],
TP.NAME AS [Name],
CAST(D.StartDate As date) AS [EFFECTIVEDATE],
D.Reference AS [Reference],
DTB.PercentageRate AS [RATE]
FROM
TradingPartners TP
RIGHT JOIN Schemes S on S.TradingPartnerId = TP.Id
RIGHT JOIN Deals D ON D.SchemeId = S.Id
LEFT JOIN DealTurnoverBands DTB ON D.Id = DTB.DealId
WHERE
TP.Reference = 'F'
And
DTB.PercentageRate > 0.1
;
SELECT
[Code] 'Supplier Code',
[Name] 'Supplier',
[EFFECTIVEDATE] 'Effective Date',
[A] 'A %',
[B] 'B %',
[C] 'C %',
[D] 'D %',
[E] 'E %',
[F] 'F %',
[E] + [F] 'G %'
FROM
@Results
PIVOT
(
MAX(RATE)
FOR Reference IN ([A], [B], [C], [D], [E], [F])
) As pivottable1
;
只是说,“通用 Table 表达式”或 CTE 就像是 sub-query 的 re-usable 模板。
例如,这个查询:
WITH CTE_DATA AS (select * from tableA)
SELECT * FROM CTE_DATA AS data;
Returns 与此查询完全相同:
SELECT * FROM (select * from tableA) AS data;
但是要合并这两个查询,您只需将它们合并到数据透视表的源查询中即可。
WITH CTE1 AS (
SELECT
TP.Reference AS [Code],
TP.NAME AS [Name],
FORMAT(D.StartDate,'yyyy-MM-dd') AS [EFFECTIVEDATE],
D.Reference AS [Reference],
DR.Rate AS [RATE]
FROM TradingP TP
RIGHT JOIN Schema S on S.TradingPId = TP.Id
RIGHT JOIN Deals D ON D.SchemaId = S.Id
LEFT JOIN DealResults DR on D.Id = DR.DealId
LEFT JOIN DealTurnoverBands DTR ON D.Id = DTR.DealId
WHERE D.Reference IN ('A', 'B', 'C', 'D', 'E')
)
, CTE2 AS (
SELECT
TP.Reference AS [Code],
TP.NAME AS [Name],
FORMAT(D.StartDate,'yyyy-MM-dd') AS [EFFECTIVEDATE],
D.Reference AS [Reference],
DTB.PercentageRate
FROM TradingPartners TP
RIGHT JOIN Schemes S on S.TradingPartnerId = TP.Id
RIGHT JOIN Deals D ON D.SchemeId = S.Id
LEFT JOIN DealTurnoverBands DTB ON D.Id = DTB.DealId
WHERE D.Reference IN ('F')
AND DBT.PercentageRate > 0.1
)
SELECT
[Code] AS [Supplier Code],
[Name] AS [Supplier],
[EFFECTIVEDATE] AS [Effective Date],
[A] AS [A %],
[B] AS [B %],
[C] AS [C %],
[D] AS [D %],
[E] AS [E %],
[F] AS [F %]
FROM (
SELECT Code, Name, EFFECTIVEDATE
, Reference
, RATE
FROM CTE1
UNION ALL
SELECT Code, Name, EFFECTIVEDATE
, Reference
, PercentageRate
FROM CTE2
) Src
PIVOT (
MAX(RATE)
FOR Reference IN ([A], [B], [C], [D], [E], [F])
) Pvt;