【问题标题】:how to accomplish this?如何做到这一点?
【发布时间】:2015-04-23 18:12:40
【问题描述】:

有以下数据

以下格式

CREATE TABLE [dbo].[Sample](
    [CCMPNY] [varchar](2) NOT NULL,
    [CCUST#] [numeric](7, 0) NOT NULL,
    [RDDYSR] [varchar](7) NOT NULL,
    [CBLNAM] [varchar](30) NOT NULL,
    [CCYCLE] [varchar](2) NOT NULL,
    [RDSIZE] [varchar](2) NOT NULL,
    [RDCHGC] [varchar](2) NOT NULL,
    [RDDAY] [numeric](1, 0) NOT NULL,
    [RDROUT] [varchar](4) NOT NULL,
    [RDQTY] [numeric](5, 0) NOT NULL

我怎样才能得到下面的布局

用红色标记的列

FREQ: "Count" of Days in "RDDYSR" field
LIFTS: "Lifts" = "RDQTY" times "Freq"
VOLUME: "Volume" = "RDQTY" times "RDSIZE" times "Freq"

Week Days columns: 
MON: If "RDDYSR" includes "M", "RDQTY" times "RDSIZE", else "blank".  
TUE: If "RDDYSR" includes "T", "RDQTY" times "RDSIZE", else "blank", etc.

注意事项

that each "CCUST" generates only one data line unless 
(1) there are multiple "RDCHGC" values (CCUST 43), 
(2) there are multiple "RDSIZE" values (CCUST 10723); or, 
(3) there are multiple "FREQ" values (no example).

感谢您的帮助。

【问题讨论】:

  • 你有没有尝试过?你搜索过什么吗? RDSIZE 的数字是多少,例如可以是“-0”、“IV”、“pi”吗?提示:使用适当的软件(MySQL、Oracle、DB2 等)和版本标记数据库问题很有帮助,例如sql-server-2014。语法和功能的差异通常会影响答案。
  • 到目前为止我可以做的是从 RDDYSR 字段中删除破折号,这样很容易计算工作日。
  • 这是一个开始。您可能希望使用 CASE 表达式来帮助处理日期列,例如case when CharIndex( 'M', RDDYSR ) > 0 then RDQTY * Cast( RDSIZE as Int ) else NULL end。请注意,将任意数据类型混合在一起通常被认为是一种不好的做法,例如将大小存储在 VARCHAR(2) 中,或者使用单个返回数值计算结果 (RDQTY * RDSIZE) 作为字符串或单词 blank。

标签: sql tsql sql-server-2008-r2


【解决方案1】:

这应该给你你正在寻找的东西有点简单。我不确定你星期天的标识符是什么,所以我用 --

注释掉了这个
select CCUST# CCUST, CBLNAM,RDCHGC, RDQTY, RDSIZE, Len(Replace(RDDYSR, '-', '')) FREQ, 
RDQTY * Len(Replace(RDDYSR, '-', '')) LIFTS, 
RDQTY * Cast(RDSIZE as int) * Len(Replace(RDDYSR, '-', '')) Volume, RDDYSR,
Case when CHARINDEX('M', RDDYSR) > 0 then RDQTY * Cast(RDSIZE as int) end as Mon,
Case when CHARINDEX('T', RDDYSR) > 0 then RDQTY * Cast(RDSIZE as int) end as Tue,
Case when CHARINDEX('W', RDDYSR) > 0 then RDQTY * Cast(RDSIZE as int) end as Wed,
Case when CHARINDEX('H', RDDYSR) > 0 then RDQTY * Cast(RDSIZE as int) end as Thu,
Case when CHARINDEX('F', RDDYSR) > 0 then RDQTY * Cast(RDSIZE as int) end as Fri,
Case when CHARINDEX('S', RDDYSR) > 0 then RDQTY * Cast(RDSIZE as int) end as Sat
--,Case when CHARINDEX(RDDYSR, 'X') > 0 then RDQTY * Cast(RDSIZE as int) end as Sun   --Whatever Sunday identifier is

from Sample

Group by CCUST#, CBLNAM, RDCHGC, RDQTY, RDSIZE, RDDYSR

SQLFiddle:http://www.sqlfiddle.com/#!6/cdb92/1/0

【讨论】:

  • @ChistianBarron 请阅读我的笔记。您的查询工作正常,但没有按照我的注释进行分组
  • 对不起,我错过了那一点。在底部添加一个简单的 Group By 应该可以解决这个问题(参见上面的更新)。 SQL Fiddle 也更新了
  • 什么可能会生成此错误消息?转换 varchar 值“1”时转换失败。到数据类型 int。
  • 它在 1 之后有一个句号。因此,在您的表格中,您必须在其中一个字段的 1 之后有一个句号。真的,如果你只在这些列中保留整数,它们应该设置为 int 而不是 varchar
  • 你确定你把它们都改成这个了吗?可能是某些行中除了句号之外还有其他无效字符
【解决方案2】:

试试这个查询,

SELECT CCUST
,CBLNAM
,RDCHGC
,RDQTY
,RDSIZE
,LEN(REPLACE(RDDYSR,'-','')) AS FREQ
,COUNT(RDDYSR)*RDQTY AS LIFTS
,RDSIZE * RDQTY * LEN(REPLACE(RDDYSR,'-','')) AS VOLUME
,FIRSTRDDYSR AS RDDYSR,FIRSTRDROUT AS RDROUT
,CASE WHEN (FIRSTRDDYSR LIKE 'M______') THEN RDQTY * RDSIZE END AS MON 
,CASE WHEN (FIRSTRDDYSR LIKE '_T_____') THEN RDQTY * RDSIZE END AS TUE
,CASE WHEN (FIRSTRDDYSR LIKE '__W____') THEN RDQTY * RDSIZE END AS WED
,CASE WHEN (FIRSTRDDYSR LIKE '___H___') THEN RDQTY * RDSIZE END AS THU
,CASE WHEN (FIRSTRDDYSR LIKE '____F__') THEN RDQTY * RDSIZE END AS FRI
,CASE WHEN (FIRSTRDDYSR LIKE '_____S_') THEN RDQTY * RDSIZE END AS SAT
FROM
(
    SELECT S.*, T.RDROUT AS FIRSTRDROUT, T.RDDYSR AS FIRSTRDDYSR FROM
    [SAMPLE] S
    INNER JOIN
    (
        SELECT CCUST, RDROUT, RDDYSR, ROW_NUMBER() OVER(PARTITION BY ccust ORDER BY (SELECT 1)) N
        FROM SAMPLE
    ) T ON S.CCUST = T.CCUST AND N = 1
) Tbl

GROUP BY CCUST, CBLNAM, RDCHGC, RDQTY, RDSIZE, RDDYSR, FIRSTRDDYSR, FIRSTRDROUT

【讨论】:

  • 使用您的查询我收到此错误 将数据类型 varchar 转换为数字时出错。
  • 这个查询非常适合我。我认为你最好的选择是找出哪条线打破了它。您的一种数字数据类型可能是 varchar。
  • @Stephan 请查看客户 BRINKMANN HARDWARE 如何为每个实例获得相同的 RDDYSR,即使最后一个不同......sqlfiddle.com/#!6/4f8e8/6
猜你喜欢
  • 2011-03-12
  • 2016-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-19
相关资源
最近更新 更多