×

Loading...
Ad by
  • 最优利率和cashback可以申请特批,好信用好收入offer更好。请点链接扫码加微信咨询,Scotiabank -- Nick Zhang 6478812600。
Ad by
  • 最优利率和cashback可以申请特批,好信用好收入offer更好。请点链接扫码加微信咨询,Scotiabank -- Nick Zhang 6478812600。

SQL问题又来了, 大侠们请再帮忙:

还是SQL SERVER, 这次我得从三个很不同的VIEW中提取数据, CREATE一个dataset. 有两个VIEW很简单, 可以很容易地union. 可是第三个VIEW很麻烦, 我现在想不出办法直接提取数据, 只好到程序里面处理数据, 然后再和另外两个VIEW的数据union. 这样一来, 程序看着很别扭.

这个VIEW基本是这样的: keys, price1, price2, price3, qty, qty_range.
dataset的要求是: keys, price, amount.

其中price是选取price1-3中最优先的一个(优先性是price1 > price2 > price3, 如果price1是0或空则选price2, 其他类推).

amount是price * qty, 或price * mid(qty_range). qty是decimal. qty_range却是varchar, 形式是 "5 - 10', "5 plus", 等等 mid有一定规则, 不麻烦. 我得verify lowerbound是numerical.

因为qty_range不好处理, 我现在只能选到price和qty/qty_range, 打算在程序里面加工, 计算amount.

请大侠们帮忙看看:
1. 能不能用一个select query实现amount? 如果能的话, 就可以直接跟另外两个view union.
2. price怎么选比较好? 我现在是用了一大堆的case, 不知道有没有简单些的方法...
Report

Replies, comments and Discussions:

  • 工作学习 / 专业技术讨论 / SQL问题又来了, 大侠们请再帮忙:
    还是SQL SERVER, 这次我得从三个很不同的VIEW中提取数据, CREATE一个dataset. 有两个VIEW很简单, 可以很容易地union. 可是第三个VIEW很麻烦, 我现在想不出办法直接提取数据, 只好到程序里面处理数据, 然后再和另外两个VIEW的数据union. 这样一来, 程序看着很别扭.

    这个VIEW基本是这样的: keys, price1, price2, price3, qty, qty_range.
    dataset的要求是: keys, price, amount.

    其中price是选取price1-3中最优先的一个(优先性是price1 > price2 > price3, 如果price1是0或空则选price2, 其他类推).

    amount是price * qty, 或price * mid(qty_range). qty是decimal. qty_range却是varchar, 形式是 "5 - 10', "5 plus", 等等 mid有一定规则, 不麻烦. 我得verify lowerbound是numerical.

    因为qty_range不好处理, 我现在只能选到price和qty/qty_range, 打算在程序里面加工, 计算amount.

    请大侠们帮忙看看:
    1. 能不能用一个select query实现amount? 如果能的话, 就可以直接跟另外两个view union.
    2. price怎么选比较好? 我现在是用了一大堆的case, 不知道有没有简单些的方法...
    • 选择 qty 或 mid(qty_range)的rule是什么?
      • 高手来了.... if qty = 0/null, then mid(qty_range).
        • 先用子查询把价格,数量算出来,上层用价格*数量算出金额。把你现在的程序贴出来,看看哪里不满意?
          • 程序在公司, 在家看不了,而且我根本就没能走到求amount那一步...现在是把qty, qty_range选成一个column, cast为varchar, 所以就不能用*了. 我得把其中的数选出来...
            • SQL SERVER不可以把字符串转换成数值型吗?或者让MID返回数值型(这是自定义函数吧?)
              • mid还没定义, 很简单, hard code就行, 比如mid(5, 10) = (5+10)/2 = 7. 问题是, 怎么样从5-10中得到5和10两个数, 我倒是想过用函数, 但是SQL/TSQL没有数列可用, at loss....
                • 解析一下不难吧,QTY_RANGE有多少种格式?SQLSERVER支持正则表达式吗?
                  • 只有两种 "5 - 10" 和 "5 plus". 我目前没查到tsql能split string. 正在看能不能用regular express...
                    • 只有两种?HARDCODE就很好了,还解析个啥……
                      • 我没说清楚, 5 - 10 和 50 - 100 算是一种...
                        • 我查到了TSQL的charindex和patindex, 好象可以用...
                          • you got it.
                    • if qty_range looks like '5 plus', how to calculate the mid(qty_range)?
            • 纠正一个错误, qty是int, 不是decimal (我怎么糊涂了)
          • try this
            SELECT
            id,
            IsNull(IsNull(IsNull(price1, price2),price3),0) AS price,
            IsNull(qty, mid(qty_range)) AS qty
            IsNull(IsNull(IsNull(price1, price2),price3),0) * IsNull(qty, mid(qty_range)) AS amount
            FROM <your_table>


            Note:
            要实现Mid() 函数,需要细化qty_rangeg规则.
            • 果然高, 精炼! 只是,IsNull(qty, mid(qty_range)) AS qty可能不行, 因为这两列的type不一样...(我下午用case的时候, DB给了错...)
              • 我明白了, 你是让我自己定义mid的时候, 把qty_range转化为int. 有些眉目了, 只是不知道TSQL能不能实现....搜ING...
                • Y
              • 改进一下。先用NullIf(qty,0) 把0转成Null, 再用IsNull()选择不同的qty or mid(qty_range).
                SELECT
                id,
                IsNull(IsNull(IsNull(price1, price2),price3),0) AS price,
                IsNull(NullIf(qty, 0), mid(qty_range)) AS qty
                IsNull(IsNull(IsNull(price1, price2),price3),0) * IsNull(NullIf(qty, 0), mid(qty_range)) AS amount
                FROM <your_table>

                Note:

                IsNull(NullIf(qty, 0), mid(qty_range)) ==>
                ------------------------------------------------
                IF qty = 0 THEN
                qty = Null
                IF qty = NULL Then
                qty = mid (qty_range)

                剩下的就是定义mid()函数了
                ------------------------------------------------
                • Great. Thanks!!! 再SIGH一下: 什么时候我也能写出这么漂亮的CODE...
                  • you are on the right track!
    • 多谢digitworm和newkid两位大侠! digitworm写的query我想我现在是怎么也写不出来的, 言简意赅. 我明天就根据这个框架, 用regular express试试...