Начало » Использование СУБД » Microsoft SQL Server » Помогите с запросом в MS SQL (Сделать из выборки отчет) 
	
		
		
			| Помогите с запросом в MS SQL [сообщение #2612] | 
			Wed, 21 June 2023 09:12   | 
		 
		
			
				
				
				
					
						  
						Андрей
						 Сообщений: 1 Зарегистрирован: June 2023 
						
					 | 
					Junior Member  | 
					 | 
		 
		 
	 | 
 
	
		Добрый день, меня зовут Андрей. Помогите пожалуйста доработать запрос. 
Запрос делает выборку которая показывает строчную выборку с I’d и кол-вот email. Нужно из него сформировать отчет, не могу разобраться. 
Должна быть одна строка, первая показывает кол-во всех строк, вторая кол-во ошибок, 3 долю ошибок от всего кол-ва, почему то через with выборка точная не происходит. 
Запрос ниже: 
USE SBL_DM_Main 
 
GO 
 
  
 
  
 
WITH CTE_E AS 
 
( 
 
       SELECT bk_Contragent_IID, COUNT (*) AS ERRORS_CONTR 
 
       FROM ( 
 
             SELECT 
 
                           C.bk_Contragent_IID 
 
             FROM [dm_exch_csh].[v_Project_Info] AS PRO 
 
                    LEFT JOIN [dm_exch_csh].[v_Leasing_Agreement_Info] AS LA ON PRO.Project_Code = LA.Project_Code 
 
                    LEFT JOIN [dm_exch_csh].[v_MD_Contragent] AS C ON PRO.Contragent_IID = C.bk_Contragent_IID 
 
                    LEFT JOIN [CSH].[stg_mds].[MD_Communication_Contragent] AS CC ON C.bk_Contragent_IID = CC.MD_Contragent_IID 
 
                    LEFT JOIN    ( 
 
                                        SELECT MD_Contragent_IID, COUNT (DR_CommunicationType_IID) AS CNT 
 
                                        FROM [CSH].[stg_mds].[MD_Communication_Contragent] 
 
                                        WHERE DR_CommunicationType_IID = 3 
 
                                        GROUP BY MD_Contragent_IID 
 
                                        ) TAB ON C.bk_Contragent_IID = TAB.MD_Contragent_IID 
 
             WHERE CC.MD_Contragent_IID IS NULL 
 
                    OR ( 
 
                           LA.Leasing_Agreement_Code IS NULL 
 
                           AND PRO.Project_Demand_Date > '2022.03.31' 
 
                           AND CC.DR_CommunicationType_IID = 3 
 
                           AND TAB.CNT = 0 
 
                           ) 
 
             UNION 
 
             SELECT 
 
                           C.bk_Contragent_IID 
 
             FROM [dm_exch_csh].[v_Leasing_Agreement_Info] AS LA 
 
                    LEFT JOIN [dm_exch_csh].[v_MD_Contragent] AS C ON LA.Contragent_IID = C.bk_Contragent_IID 
 
                    LEFT JOIN [CSH].[stg_mds].[MD_Communication_Contragent] AS CC ON C.bk_Contragent_IID = CC.MD_Contragent_IID 
 
                    LEFT JOIN    ( 
 
                                        SELECT MD_Contragent_IID, COUNT (DR_CommunicationType_IID) AS CNT 
 
                                        FROM [CSH].[stg_mds].[MD_Communication_Contragent] 
 
                                        WHERE DR_CommunicationType_IID = 3 
 
                                        GROUP BY MD_Contragent_IID 
 
                                        ) TAB ON C.bk_Contragent_IID = TAB.MD_Contragent_IID 
 
             WHERE CC.MD_Contragent_IID IS NULL 
 
                    OR ( 
 
                           LA.Delivery_Date <> '' 
 
                                  AND ( 
 
                                        la.Archive_Transfer_Date > '2022-03-31' 
 
                                        OR la.Archive_Transfer_Date = '' 
 
                                        ) 
 
                                  AND TAB.CNT = 0 
 
                           ) 
 
       ) AS T 
 
       GROUP BY bk_Contragent_IID 
 
), -- таблицы внутри конструкции WITH перечесляются через запятую и оборачиваются в скобки 
 
CTE_C AS -- таблица записей всего 
 
( 
 
       SELECT bk_Contragent_IID, COUNT (*) AS ALL_CONTR 
 
       FROM ( 
 
             SELECT C.bk_Contragent_IID 
 
             FROM [dm_exch_csh].[v_Project_Info] AS PRO 
 
                    LEFT JOIN [dm_exch_csh].[v_Leasing_Agreement_Info] AS LA ON PRO.Project_Code = LA.Project_Code 
 
                    LEFT JOIN [dm_exch_csh].[v_MD_Contragent] AS C ON PRO.Contragent_IID = C.bk_Contragent_IID 
 
             WHERE LA.Leasing_Agreement_Code IS NULL 
 
                    AND PRO.Project_Demand_Date > '2022.03.31' 
 
             UNION 
 
             SELECT C.bk_Contragent_IID 
 
             FROM [dm_exch_csh].[v_Leasing_Agreement_Info] AS LA 
 
                    LEFT JOIN [dm_exch_csh].[v_MD_Contragent] AS C ON LA.Contragent_IID = C.bk_Contragent_IID 
 
             WHERE la.Archive_Transfer_Date > '2022-03-31' 
 
                    OR la.Archive_Transfer_Date = '' 
 
             ) AS T 
 
       GROUP BY bk_Contragent_IID 
 
).  
 
—- пример доработки запроса 
 
SELECT COUNT (CTE_E.bk_Contragent_IID ) AS [Ошибки], COUNT (CTE_C.bk_Contragent_IID ) AS [Все строки] 
 
FROM CTE_E,CTE_C 
 
		
		
		
 |  
	| 
		
	 | 
 
 
 |  
	| 
		
 |  
	
		
		
			| Re: Помогите с запросом в MS SQL [сообщение #2704 является ответом на сообщение #2612] | 
			Fri, 07 July 2023 15:46   | 
		 
		
			
				
				
				
					
						  
						flexgen
						 Сообщений: 27 Зарегистрирован: July 2022 
						
					 | 
					Junior Member  | 
					 | 
		 
		 
	 | 
 
	| 
		Я так понимаю что все объекты v_* это views? И с какими условиями они построены - неизвестно? Тогда разобраться будет практически невозможно. Могу посоветовать сначала выяснить какие данные возвращают запросы к каждой View, потом связывать их по одной с главной таблицей и смотреть на результат. Так ты сможешь понять какой именно JOIN портит картину. Другого варианта не вижу.
		
		
		
 |  
	| 
		
	 | 
 
 
 |   
Переход к форуму:
 
 Текущее время: Tue Nov 04 03:34:32 GMT+3 2025 
 Общее время, затраченное на создание страницы: 0.01089 секунд 
 |