我可以使用 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 NULLNULL 值不会通过 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;