2016-09-20 2 views
0

У меня есть некоторые подзапросы, которые возвращают одинаковые значения для каждого PolicyNumber. Как я могу заменить повторяющееся значение на «-» и отображать его только в верхней строке для каждой политики? Сейчас у меня есть это: enter image description here Но мне нужно что-то вроде этого: enter image description hereКак я могу отображать повторяющиеся значения только один раз и иметь «-», если он повторяется

SELECT 
    -------------/* GrossPremium*/ 

      (SELECT ISNULL(SUM(tblFin_InvoiceDetails.AmtBilled), 0) 
       FROM tblFin_InvoiceDetails WITH (NOLOCK) 
       WHERE (tblFin_InvoiceDetails.ChargeType = 'P') 
       AND (tblFin_InvoiceDetails.InvoiceNum = INV.InvoiceNum)) 
       AS GrossPremium 

--------------/*CompanyCommissionPercentage*/ 

       ,((SELECT ISNULL(SUM(tblFin_InvoiceDetails.MGAAmt), 0) 
       FROM tblFin_InvoiceDetails 
       WHERE (tblFin_InvoiceDetails.ChargeType = 'P') 
       AND (tblFin_InvoiceDetails.InvoiceNum = INV.InvoiceNum)) 
       + 
        CASE WHEN INV.Remitter = 'B' then 
        (SELECT ISNULL(SUM(tblFin_InvoiceDetails.RemitterAmt), 0) 
        FROM tblFin_InvoiceDetails 
        WHERE (tblFin_InvoiceDetails.ChargeType = 'P') 
        AND (tblFin_InvoiceDetails.InvoiceNum = INV.InvoiceNum))----------------RemitterCommission 

       ELSE 
        (SELECT ISNULL(SUM(tblFin_InvoicedItemsPayees.PayeeAmt), 0) 
        FROM tblFin_InvoicedItemsPayees 
        INNER JOIN tblFin_PolicyCharges pc on pc.ChargeCode = tblFin_InvoicedItemsPayees.ChargeCode and pc.chargeType = 'P' 
        WHERE (tblFin_InvoicedItemsPayees.InvoiceNum = INV.InvoiceNum and tblFin_InvoicedItemsPayees.PayeeGuid = INV.ProducerLocationGuid)) 
       END) * 100/
       NULLIF((SELECT ISNULL(SUM(tblFin_InvoiceDetails.AmtBilled), 0) 
       FROM tblFin_InvoiceDetails WITH (NOLOCK) 
       WHERE (tblFin_InvoiceDetails.ChargeType = 'P') 
       AND (tblFin_InvoiceDetails.InvoiceNum = INV.InvoiceNum)),0) 
       AS CompanyCommissionPercentage 
FROM [tblFin_PayablesWorking] PW 
INNER JOIN tblFin_Invoices INV ON PW.InvoiceNumber=INV.InvoiceNum 
+0

Хотя это можно сделать в SQL, этот тип манипуляции обычно лучше выполняется на прикладном уровне. –

+0

Да, но конечный пользователь должен извлечь данные в Excel. Затем проверьте, убедитесь, что все в порядке, и отправьте его кому бы то ни было. Thats the probmem – Oleg

+0

В этом случае может быть лучше иметь скрипт VBA, в то время как я делал то же самое сегодня, и в Excel VBA это можно сделать в 5 строках с легкостью. –

ответ

1

Ну так как вы не упоминаете вам полный запрос и таблицу схему, я дам свой ответ с два простыми example.If вы хотите заменить повторяющееся значение с последующей - этого запроса (пожалуйста, измените столбцы имя в соответствии к вашим потребностям). Если вы хотите выбрать существующую таблицу:

;with ts as (
    select S1.[ProductID], row_number() over (partition by S1.[ProductID] order by S1.[ProductID]) as seqnum 
    from (SELECT [SalesID],[ProductID] FROM [Sales]) AS S1 --Replace 'SELECT [ProductID] FROM [Sales]' with your Subquery and change the column accordingly 
) 
SELECT 
(case when seqnum = 1 then [ProductID] ELSE '-' end) as [ProductID] 
FROM ts 

ДЛЯ ИСПОЛЬЗОВАНИЯ подзапроса:

--CREATE TABLE [dbo].[Sales](
-- [SalesID] [uniqueidentifier] NOT NULL DEFAULT (newid()), 
-- [ProductID] [int] NOT NULL, 
-- [EmployeeID] [int] NOT NULL, 
-- [Quantity] [smallint] NOT NULL, 
-- [SaleDate] [datetime] NOT NULL CONSTRAINT [DF_SaleDate] DEFAULT (getdate()), 
-- CONSTRAINT [PK_SalesID] PRIMARY KEY CLUSTERED 
--(
-- [SalesID] ASC 
--)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
--) ON [PRIMARY] 

--GO 
--INSERT [dbo].[Sales] ([SalesID], [ProductID], [EmployeeID], [Quantity], [SaleDate]) VALUES (N'9498d566-e31b-4ac8-ab54-1c898471fba8', 2, 1, 1, CAST(N'2012-03-01 00:00:00.000' AS DateTime)) 
--INSERT [dbo].[Sales] ([SalesID], [ProductID], [EmployeeID], [Quantity], [SaleDate]) VALUES (N'69c7dff4-fbac-48d3-ae0a-5027c816acd2', 2, 2, 2, CAST(N'2012-04-01 00:00:00.000' AS DateTime)) 
--INSERT [dbo].[Sales] ([SalesID], [ProductID], [EmployeeID], [Quantity], [SaleDate]) VALUES (N'a40b9505-4a2c-4186-a89b-88a401248a58', 1, 1, 4, CAST(N'2012-02-01 00:00:00.000' AS DateTime)) 
--INSERT [dbo].[Sales] ([SalesID], [ProductID], [EmployeeID], [Quantity], [SaleDate]) VALUES (N'04856027-d7ad-40fe-889b-8d933595ffde', 3, 1, 2, CAST(N'2012-02-01 00:00:00.000' AS DateTime)) 
--INSERT [dbo].[Sales] ([SalesID], [ProductID], [EmployeeID], [Quantity], [SaleDate]) VALUES (N'173be2de-3b80-4a3d-8bcc-a74d0d70b3a9', 3, 2, 1, CAST(N'2012-03-01 00:00:00.000' AS DateTime)) 
--GO 



;with ts as (

    SELECT 
    JOIN1.[SalesID] AS [SalesID] 
    , JOIN1.[ProductID] 
    , JOIN1.seqnum AS seqnum 
    , JOIN2.[EmployeeID], JOIN2.seqnum2 AS seqnum2 

    FROM 
    (
    select row_number() over (order by S1.[SalesID] asc) as RowNumber 
    , S1.[SalesID] AS [SalesID] 
    , S1.[ProductID] AS [ProductID] 
    , row_number() over (partition by S1.[ProductID] order by S1.[SalesID]) as seqnum 
    from (SELECT [SalesID],[ProductID] FROM [Sales]) AS S1 --Replace 'SELECT [ProductID] FROM [Sales]' with your Subquery (For Example GrossPremium) and change the column accordingly. Remember you need some thing common for Iner join, in this case [SalesID] 
    )AS JOIN1 

    INNER JOIN 
    (
    select row_number() over (order by S2.[SalesID] asc) as RowNumber 
    , S2.[SalesID] AS [SalesID] 
    , S2.[EmployeeID] AS [EmployeeID] 
    , row_number() over (partition by S2.[EmployeeID] order by S2.[SalesID]) as seqnum2 
    from (SELECT [SalesID],[EmployeeID] FROM [Sales]) AS S2 --Replace 'SELECT [[SalesID]] FROM [Sales]' with your Subquery (For Example CompanyCommissionPercentage) and change the column accordingly. Remember you need some thing common for Iner join, in this case [SalesID] 
    )AS JOIN2 

    ON JOIN1.[SalesID]=JOIN2.[SalesID] 

) 


SELECT 
(case when seqnum = 1 then [ProductID] ELSE '-' end) as [ProductID] 
,(case when seqnum2 = 1 then [EmployeeID] ELSE '-' end) as [EmployeeID] 
FROM (Select TOP 10000000 *FROM ts ORDER BY [SalesID] ASC) AS ts -- Mentioning TOP is Must, or it will give Error 

Я знаю, почему вы используете - вместо NULL, - займет место

+1

Спасибо !!!!!!!!!!!!!!!!!! – Oleg

0

, если вы хотите сделать это в SQL (вы, вероятно, не это довольно некрасиво) вы могли бы сделать что-то вроде этого используя LAG(). Он полагается на наличие поля, которое вы можете использовать для сортировки записей для каждого номера политики, в моих фиктивных данных ниже я включил в него поле, называемое RecordID, для этого.

SELECT 
    PolicyNumber 
    ,CASE 
     WHEN LAG(GrossPremium) OVER(PARTITION BY PolicyNumber ORDER BY RecordID) IS NULL 
     THEN CAST(GrossPremium AS VARCHAR(MAX)) 
     ELSE '-' 
    END GrossPremium 
    ,CASE 
     WHEN LAG(CompanyComissionPercentage) OVER(PARTITION BY PolicyNumber ORDER BY RecordID) IS NULL 
     THEN CAST(CompanyComissionPercentage AS VARCHAR(MAX)) 
     ELSE '-' 
    END CompanyComissionPercentage 
    ,CASE 
     WHEN LAG(RemitterCommissionPercentage) OVER(PARTITION BY PolicyNumber ORDER BY RecordID) IS NULL 
     THEN CAST(RemitterCommissionPercentage AS VARCHAR(MAX)) 
     ELSE '-' 
    END RemitterCommissionPercentage 
    ,CASE 
     WHEN LAG(RemitterCommission) OVER(PARTITION BY PolicyNumber ORDER BY RecordID) IS NULL 
     THEN CAST(RemitterCommission AS VARCHAR(MAX)) 
     ELSE '-' 
    END GrossCommission 
    ,CASE 
     WHEN LAG(RemitterCommission) OVER(PARTITION BY PolicyNumber ORDER BY RecordID) IS NULL 
     THEN CAST(RemitterCommission AS VARCHAR(MAX)) 
     ELSE '-' 
    END GrossCommission 
FROM 
( 
    -- Dummy data 
    SELECT 
      1234 PolicyNumber -- Partition the LAG() on the policy number. 
      ,1 RecordID -- use this to order the LAG() function. 
      ,8749.00 GrossPremium 
      ,18 CompanyComissionPercentage 
      ,10 RemitterCommissionPercentage 
      ,874.90 RemitterCommission 
      ,1574.82 GrossCommission 
    UNION ALL 
    SELECT 
      1234 
      ,2 RecordID 
      ,8749.00 
      ,18 
      ,10 
      ,874.90 
      ,1574.82 
    UNION ALL 
    SELECT 
      5678 
      ,1 RecordID 
      ,8749.00 
      ,18 
      ,10 
      ,874.90 
      ,1574.82 
) x; 
Смежные вопросы