【问题标题】:Minimum values between multiple columns ignoring zero and null value columns忽略零值和空值列的多列之间的最小值
【发布时间】:2014-07-02 22:33:03
【问题描述】:

我想从以下 5 列中创建一个名为 Market_Min 的新变量,其中:

Col 1 is 0
Col 2 is 100
Col 3 is 200
Col 4 is 150
Col 5 is NULL

在这种情况下,答案应该是 100。

【问题讨论】:

  • 你关心使用哪种语言吗?你能用 Excel 或 LibreOffice 之类的电子表格软件吗?
  • 抱歉忘了提...它在 SQL 中
  • 为什么100 是正确答案?您在寻找最小的正非空数吗?
  • 目前我使用以下代码:CASE WHEN Col1 > 0 then (CASE WHEN isnull(Col1,999999) 0 then (CASE WHEN isnull(Col2,999999) )
  • 是的..我正在寻找非空和非零的最小数字作为答案..

标签: sql minimum


【解决方案1】:

使用 fn_Split 使用不同的方法

DECLARE @Temp AS TABLE (col1 int, col2 int,  col3 int, col4 int , col5 int)

INSERT INTO @Temp
    (col1 , col2 ,  col3 , col4 , col5 )
VALUES
    ( 0, 200, 100, 150,NULL)
SELECT
    *
    ,
    (
    SELECT 
        MIN(Value) 
    FROM 
        dbo.fn_Split
        (
          CAST(ISNULL(NULLIF(col1,0),99999) AS VARCHAR(10)) +','
        + CAST(ISNULL(NULLIF(col2,0),99999) AS VARCHAR(10)) +','
        + CAST(ISNULL(NULLIF(col3,0),99999) AS VARCHAR(10)) +','
        + CAST(ISNULL(NULLIF(col4,0),99999) AS VARCHAR(10)) +','
        + CAST(ISNULL(NULLIF(col5,0),99999) AS VARCHAR(10))
        ,','
        )
    ) AS MinNonZeroNonNullValue
FROM
    @Temp

您需要将 fn_Split 函数添加到服务器。可以下载Here

【讨论】:

    【解决方案2】:

    这是使用union all 获取整个表格的最小值的一个选项:

    select min(combinedcol)
    from (
        select col1 combinedcol from yourtable union all
        select col2 from yourtable union all
        select col3 from yourtable union all
        select col4 from yourtable union all
        select col5 from yourtable
    ) t
    where coalesce(combinedcol,0) > 0
    

    根据 cmets 编辑基础

    如果您需要每行的最小值,您可以在子查询中引入row_numbergroup by

    select rn, min(combinedcol)
    from (
        select row_number() over (order by (select null)) rn, col1 combinedcol from yourtable union all
        select row_number() over (order by (select null)) rn, col2 from yourtable union all
        select row_number() over (order by (select null)) rn, col3 from yourtable union all
        select row_number() over (order by (select null)) rn, col4 from yourtable union all
        select row_number() over (order by (select null)) rn, col5 from yourtable
    ) t
    where coalesce(combinedcol,0) > 0
    group by rn
    

    【讨论】:

    • 啊!它有效..但它给了我一个最小值..我实际上有 1000 行和 5 列,我想为每一行获得一个最小值..为混乱道歉..请帮助
    • 我基本上想在数据中添加一个新列,以显示 5 列中每一行的最小值
    • @user3637879 -- 你需要一个 row_number 来分组。如果有身份证最好如果没有,您可以像这样创建一个:sqlfiddle.com/#!3/cbdb4/4
    • 例如,第 1 行:第 1 列是 0 第 2 列是 100 第 3 列是 200 第 4 列是 150 第 5 列是 NULL,第 2 行:第 1 列是 400 第 2 列是 120 第 3 列是 200 Col 4 为 150 Col 5 为 NULL.. 我想将 Col 6 添加为 Market_Min,第 1 行值为 100,第 2 行值为 120
    • 很好的答案 sgeddes。如果您有要分组的行标识符,则可以使用上述方法获取每行的最小 val。即 RecordId, MIN(ComineCol) .... stuff ... GROUP BY RecordId
    猜你喜欢
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 1970-01-01
    • 2013-11-22
    • 2022-06-16
    • 2015-03-05
    • 2019-06-28
    • 2021-12-27
    相关资源
    最近更新 更多