SQL根据条件使用值替换重复记录

时间:2017-09-08 18:21:43

标签: sql-server reporting-services

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

总共有3种类型的商品:product_A,product_B和product_C。 有超过一千个唯一的store_ID。

我的问题是一些唯一的store_ID有多个store_Products,我需要缩小查询,以便它只返回唯一的store_IDs

这些是条件规则:

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

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

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

所以下面的例子解释了我在左边的内容以及我想在右边看到的内容:

enter image description here

我正在使用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]

1 个答案:

答案 0 :(得分:0)

我在这里非常偷偷摸摸:

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