【问题标题】:How can I display repeated values only one time and have '-' if it repeats如何仅显示一次重复值并在重复时显示“-”
【发布时间】:2016-09-20 23:13:31
【问题描述】:

我有一些子查询为每个 PolicyNumber 检索相同的值。如何用“-”替换重复值,并在每个策略的顶行只显示一个? 现在我有这个: 但我需要这样的东西:

 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

【问题讨论】:

  • 虽然可以在 SQL 中完成,但这种类型的操作通常最好在应用层完成。
  • 是的,但最终用户需要在 Excel 中提取数据。然后检查,确保它没问题,然后发送给任何人。这就是问题
  • 在这种情况下,在 Excel 中使用 VBA 脚本可能会更好,有趣的是我今天也在做同样的事情,而在 Excel VBA 中,它可以轻松地在 5 行中完成。
  • 这听起来很有趣,但我从来没有真正在 VBA 中编写过代码。有什么好的来源吗?谢谢

标签: sql sql-server tsql reporting-services


【解决方案1】:

好吧,既然你没有提到你的完整查询和表模式,我会用两个简单的例子给你答案。如果你想用 - 替换你的重复值,请按照这个查询(请根据你的需要)。 如果您想选择现有表:

 ;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- 会占用空间

【讨论】:

    【解决方案2】:

    如果您想在 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      相关资源
      最近更新 更多