【问题标题】:SQL replace duplicate record with value based on conditionSQL根据条件用值替换重复记录
【发布时间】:2018-02-17 17:38:01
【问题描述】:

我正在尝试创建一个报告,显示按商店位置 (store_ID) 购买的单个商品 (store_Product)。

store_Product 共有 3 种类型:product_A、product_B 和 product_C。 有超过一千个唯一的 store_ID。

我的问题是一些唯一的 store_ID 有多个 store_Products,我需要缩小查询,使其仅返回唯一的 store_ID

这些是条件规则:

  • 如果商店有 product_B 和任何其他产品,则一个唯一的 store_ID 记录会将 product_B 作为 store_Product 值

  • 如果商店有 product_A 和 product_C,则一个唯一的 store_ID 记录会将 product_A 作为 store_Product 值

  • 如果商店只有一条记录,则 store_Product 保持不变。

所以下面的例子解释了我在左边的内容以及我希望它在右边的样子:

我正在使用 SQL Server 2014 在 SSRS 中构建报告。

非常感谢任何帮助!

编辑:到目前为止我所拥有的:

SELECT [store_ID]
  ,MIN(CASE WHEN store_product = 'product_B' THEN '1_product_B'
        WHEN store_product = 'product_A' THEN '2_product_A'
        ELSE '3_product_C' END) AS 'Prob_Group'
  ,CASE 
    WHEN (DATEDIFF(MINUTE, Opened_Time, GETDATE())) * 1.0 / 60 < '24'
        THEN '0 - 24 HRs'
    WHEN (DATEDIFF(MINUTE, Opened_Time, GETDATE())) * 1.0 / 60 >= '24'
        AND (DATEDIFF(MINUTE, Opened_Time, GETDATE())) * 1.0 / 60 < '48'
        THEN '24 - 48 HRs'
    WHEN (DATEDIFF(MINUTE, Opened_Time, GETDATE())) * 1.0 / 60 >= '48'
        AND (DATEDIFF(MINUTE, Opened_Time, GETDATE())) * 1.0 / 60 < '72'
        THEN '48 - 72 HRs'

        ELSE 'Over 168 HRs'

        END AS 'Hour_Range'
FROM myTable 
WHERE *filters*
GROUP BY [store_ID]
        ,CASE 
        WHEN (DATEDIFF(MINUTE, Opened_Time, GETDATE())) * 1.0 / 60 < '24'
            THEN '0 - 24 HRs'
        WHEN (DATEDIFF(MINUTE, Opened_Time, GETDATE())) * 1.0 / 60 >= '24'
            AND (DATEDIFF(MINUTE, Opened_Time, GETDATE())) * 1.0 / 60 < '48'
            THEN '24 - 48 HRs'
        WHEN (DATEDIFF(MINUTE, Opened_Time, GETDATE())) * 1.0 / 60 >= '48'
            AND (DATEDIFF(MINUTE, Opened_Time, GETDATE())) * 1.0 / 60 < '72'
            THEN '48 - 72 HRs'
            ELSE 'Over 168 HRs'
            END     
ORDER BY [store_ID]

【问题讨论】:

  • 我们需要一些细节。这是一个很好的起点。 spaghettidba.com/2015/04/24/…
  • 向我们展示数据库架构、示例数据、当前和预期输出。请阅读How-to-Ask 这里是START 了解如何提高问题质量并获得更好答案的好地方。 How to create a Minimal, Complete, and Verifiable example
  • @JuanCarlosOropeza 我已在主帖中添加了我的代码,但下半部分不会保持代码格式。仅当包含小时范围案例语句时,我的示例数据才会返回 store_ID 的副本。我没有测试过,它工作正常。请帮助我朝着正确的方向前进。我将非常感激
  • 您尚未添加样本数据、当前和预期输出。在确定我应该得到什么结果之前,我不会再试一次。并正确格式化查询。
  • 我可能错了,目前无法测试,但您也许可以添加@JuanCarlosOropeza 在他对 GROUP BY 子句的回答中给出的 CASE 语句。

标签: sql-server reporting-services


【解决方案1】:

我在这里很偷偷摸摸:

SELECT store_id, 
       MIN( CASE WHEN store_Product = "product_B" THEN "1_product_B"
                 WHEN store_Product = "product_A" THEN "2_product_A"
                 ELSE "3_product_C" 
            END) as Product
FROM YourTable
GROUP BY store_id

所以如果商店有product_B,则结果将是1_product_B,不管是product_A 还是product_C

如果不是product_B 则相同,2_product_A3_product_C 之间的最小值是 2_product_A 如果只有 product_A 也可以。

得到结果后可以去掉前两个字符

WITH cte as (
    SELECT store_id, 
           MIN( CASE WHEN store_Product = "product_B" THEN "1_product_B"
                     WHEN store_Product = "product_A" THEN "2_product_A"
                     ELSE "3_product_C" 
                END) as Product
    FROM yourTable
    GROUP BY store_id
)
SELECT store_id, RIGHT(Product, LEN(Product) - 2) AS fixProductName
FROM CTE

【讨论】:

  • 非常感谢您的帮助!我忘了提到一个细节,我还有另一列是一个案例陈述,它根据购买时间确定一个小时范围。所以我也必须将这个案例陈述包含在我的组中。这导致我得到重复。这是我到目前为止所拥有的:
  • 我已经在主帖中添加了我的代码,因为它太长了,无法添加到 cmets
  • 我讨厌这种情况发生。你努力回答这个问题,甚至不是真正的问题:(\
  • 非常抱歉:(我认为如果我限制我提供的信息量会有所帮助,但我错了。
猜你喜欢
  • 2021-05-09
  • 2019-04-04
  • 2022-12-06
  • 2016-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
相关资源
最近更新 更多