【问题标题】:MS SQL 2014 - rankMS SQL 2014 - 排名
【发布时间】:2018-04-18 13:53:11
【问题描述】:

我需要对行进行排名,以使每个客户都获得一张发票,除非将单独的发票值设置为 1 - 然后这个设备会单独开具发票。非常感谢任何帮助。

CREATE TABLE #Tmp (DeviceId INT, CustomerId INT, SeparateInv TINYINT)
INSERT INTO #Tmp VALUES (10, 1, 0)
INSERT INTO #Tmp VALUES (11, 1, 0)
INSERT INTO #Tmp VALUES (12, 1, 1)
INSERT INTO #Tmp VALUES (13, 1, 1)
INSERT INTO #Tmp VALUES (17, 2, 0)
INSERT INTO #Tmp VALUES (19, 2, 0)

CREATE TABLE #TmpRank (DeviceId INT, CustomerId INT, SeparateInv TINYINT, InvoiceId INT)
INSERT INTO #TmpRank VALUES (10, 1, 0, 1)
INSERT INTO #TmpRank VALUES (11, 1, 0, 1)
INSERT INTO #TmpRank VALUES (12, 1, 1, 2)
INSERT INTO #TmpRank VALUES (13, 1, 1, 3)
INSERT INTO #TmpRank VALUES (17, 2, 0, 4)
INSERT INTO #TmpRank VALUES (19, 2, 0, 4)

问候, 普热梅克

【问题讨论】:

  • 可以用deviceid订购吗?
  • 如果在表中插入值 (14, 1, 0),您的预期输出是什么?当发票从 ​​1 设置为 0 时,你会遇到这种情况吗?

标签: sql sql-server rank


【解决方案1】:
SELECT *, DENSE_RANK() OVER (ORDER BY CustomerId, CASE WHEN SeparateInv = 1 THEN DeviceId END)
FROM #Tmp

这里的想法是,对于SeparateInv = 1,需要为每个CustomerId/DeviceId 组合生成一个发票,但是当SeparateInv = 0 时,需要为每个CustomerId 生成一个发票。这些可以组合在一个表达式中:需要为每个 CustomerId/SeparateInvDeviceId 组合生成发票,其中 SeparateInvDeviceId 是根据 SeparateInvDeviceId 计算得出的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 2016-06-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多