MS SQL срастить взаимосвязанный запрос с with запросом
Есть 2 запроса, оба выполняются отлично, но по отдельности.
Запрос 1:
WITH t1_CTE (t1_Дата, index_Дата)
AS
(
SELECT [Дата] AS t1_Дата,
ROW_NUMBER() OVER(ORDER BY Дата ASC) - 1 AS index_Дата
FROM [DB1].[dbo].[Testing]
WHERE Дата >= CONCAT(SUBSTRING('2021-08-10', 1, 4), SUBSTRING('2021-08-10', 6, 2), SUBSTRING('2021-08-10', 9, 2)) AND Дата <= CONCAT(SUBSTRING('2021-08-26', 1, 4), SUBSTRING('2021-08-26', 6, 2), SUBSTRING('2021-08-26', 9, 2))
GROUP BY Дата
)
SELECT t1_Дата AS Select_day
FROM t1_CTE
WHERE index_Дата = 0 --20210810
Дата - хранится в числовом виде, например 20210810. Но в запрос попадает в строковом виде 2021-08-10
Запрос 2:
SELECT IIF([Наименование субъекта] IS NULL, 'Не задано', [Наименование субъекта]) AS Area,
[Наименование текущего владельца] AS Kontragent,
SUM([Количество упаковок]) AS cnt,
[Дата] AS Select_day
FROM [DB1].[dbo].[Testing]
WHERE Дата = '20210810'
AND case when [Наименование субъекта] is null then 'Не задано' else [Наименование субъекта] end in ('Пермский край', 'Московская область')
GROUP BY [Наименование субъекта], [Наименование текущего владельца]
ORDER BY SUM([Количество упаковок]) DESC
В этом запросе нет смысла объяснять функциональность. Нужно лишь в WHERE Дата = подставить Select_day.
Вопрос без создание таблиц и заполнения данных. Хочу лишь понять как возможно их срастить.
Microsoft SQL Server 2012 (SP4-GDR) (KB4583465) - 11.0.7507.2 (X64) Nov 1 2020 00:48:37 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows NT 6.2 (Build 9200: ) (Hypervisor)
UPDATE
Решил свои образом:
WITH t1_CTE (t1_Дата, index_Дата)
AS
(
SELECT [Дата] AS t1_Дата,
ROW_NUMBER() OVER(ORDER BY Дата ASC) - 1 AS index_Дата
FROM [DB1].[dbo].[Testing]
WHERE Дата >= CONCAT(SUBSTRING('2021-08-10', 1, 4), SUBSTRING('2021-08-10', 6, 2), SUBSTRING('2021-08-10', 9, 2)) AND Дата <= CONCAT(SUBSTRING('2021-08-26', 1, 4), SUBSTRING('2021-08-26', 6, 2), SUBSTRING('2021-08-26', 9, 2))
GROUP BY Дата
)
SELECT IIF([Наименование субъекта] IS NULL, 'Не задано', [Наименование субъекта]) AS Area,
[Наименование текущего владельца] AS Kontragent,
SUM([Количество упаковок]) AS cnt
FROM [DB1].[dbo].[Testing]
LEFT JOIN t1_CTE ON Дата = t1_Дата
WHERE Дата = t1_CTE.t1_Дата
AND index_Дата = 0
AND case when [Наименование субъекта] is null then 'Не задано' else [Наименование субъекта] end in ('Пермский край')
GROUP BY [Наименование субъекта], [Наименование текущего владельца]
ORDER BY SUM([Количество упаковок]) DESC
Ответы (1 шт):
Превращаешь внешний запрос из первого запроса в ещё один CTE, и используешь во втором запросе.
WITH
-- CTE первого запроса
t1_CTE (t1_Дата, index_Дата)
AS
(
SELECT [Дата] AS t1_Дата,
ROW_NUMBER() OVER(ORDER BY Дата ASC) - 1 AS index_Дата
FROM [DB1].[dbo].[Testing]
WHERE Дата >= CONCAT(SUBSTRING('2021-08-10', 1, 4), SUBSTRING('2021-08-10', 6, 2), SUBSTRING('2021-08-10', 9, 2)) AND Дата <= CONCAT(SUBSTRING('2021-08-26', 1, 4), SUBSTRING('2021-08-26', 6, 2), SUBSTRING('2021-08-26', 9, 2))
GROUP BY Дата
),
-- внешний запрос, преобразованный в CTE
query1_cte AS (
SELECT CONCAT(SUBSTRING(CAST(t1_Дата AS nvarchar), 1, 4), '-', SUBSTRING(CAST(t1_Дата AS nvarchar), 5, 2), '-', SUBSTRING(CAST(t1_Дата AS nvarchar), 7, 2)) AS Select_day
FROM t1_CTE
WHERE index_Дата = 0
)
-- второй запрос
SELECT IIF([Наименование субъекта] IS NULL, 'Не задано', [Наименование субъекта]) AS Area,
[Наименование текущего владельца] AS Kontragent,
SUM([Количество упаковок]) AS cnt,
[Дата] AS Select_day
FROM [DB1].[dbo].[Testing]
-- с использованием второго CTE вместо WHERE с вручную скопированным значением
JOIN query1_cte ON [DB1].[dbo].[Testing].Дата = query1_cte.Select_day
AND case when [Наименование субъекта] is null then 'Не задано' else [Наименование субъекта] end in ('Пермский край', 'Московская область')
GROUP BY [Наименование субъекта], [Наименование текущего владельца]
ORDER BY SUM([Количество упаковок]) DESC