Sql 数字还是字符串?如果是数字,请不要对比较值使用引号 我将日期常量更改为标准YYYY-MM-DD格式

Sql 数字还是字符串?如果是数字,请不要对比较值使用引号 我将日期常量更改为标准YYYY-MM-DD格式,sql,sql-server,Sql,Sql Server,你应该 group by case when s.Customer is not null then 'Paid' else 'Free' END, Status, case when CompleteDate < '4/1/2018' then '1H' else '2H' end 分组依据 如果s.Customer不为空,则“已支付”或“免费”结束, 地位 完工日期

你应该

group by 
  case when s.Customer is not null then 'Paid' else 'Free' END,
  Status,
  case when CompleteDate < '4/1/2018' then '1H' else '2H' end
分组依据
如果s.Customer不为空,则“已支付”或“免费”结束,
地位
完工日期<'2018年4月1日'之后为'1H'或'2H'结束
否则,您仍在创建由不同客户和日期组成的组。

您应该

group by 
  case when s.Customer is not null then 'Paid' else 'Free' END,
  Status,
  case when CompleteDate < '4/1/2018' then '1H' else '2H' end
分组依据
如果s.Customer不为空,则“已支付”或“免费”结束,
地位
完工日期<'2018年4月1日'之后为'1H'或'2H'结束
否则,您仍然在创建由不同客户和日期组成的组

我做错了什么

虽然其他答案解释了如何解决问题,但您明确询问了自己做错了什么,我希望这个答案能帮助您理解

对您的选择进行此更改,您将看到:

select 
   case when s.Customer is not null then 'Paid' else 'Free' END as Paid_Free,
   Status,
   case when CompleteDate < '4/1/2018' then '1H' else '2H' end as Busy, 
   --my additions
   s.customer,
   CompleteDate,
   count(*) userCount
选择
如果美国客户不为空,则“已付款”或“免费”结束为“免费”,
地位
案例完工日期<'2018年4月1日',然后是'1H'或'2H'结束忙碌,
--我的补充
s、 顾客,
完成,
计数(*)用户计数
不再重复行!(我没有压扁重复项,而是添加了实际分组的列,因此您仍然可以得到所有意外的行,但很容易看出它们出现的原因。)

customer/status/completedate的组合是唯一的,但您可以在数据分组后对其进行转换。转换此数据的结果是它变得不那么精确-2018年4月1日之前有数千个日期,但您有效地将其转换为布尔值(在之前或之后)。所有日期为2018年3月29日、2018年3月28日等的行。。以前是唯一的,现在都变成了相同的值,因此出现了明显的重复

隐藏信息/以这种方式丢失精度会创建重复项

我做错了什么

虽然其他答案解释了如何解决问题,但您明确询问了自己做错了什么,我希望这个答案能帮助您理解

对您的选择进行此更改,您将看到:

select 
   case when s.Customer is not null then 'Paid' else 'Free' END as Paid_Free,
   Status,
   case when CompleteDate < '4/1/2018' then '1H' else '2H' end as Busy, 
   --my additions
   s.customer,
   CompleteDate,
   count(*) userCount
选择
如果美国客户不为空,则“已付款”或“免费”结束为“免费”,
地位
案例完工日期<'2018年4月1日',然后是'1H'或'2H'结束忙碌,
--我的补充
s、 顾客,
完成,
计数(*)用户计数
不再重复行!(我没有压扁重复项,而是添加了实际分组的列,因此您仍然可以得到所有意外的行,但很容易看出它们出现的原因。)

customer/status/completedate的组合是唯一的,但您可以在数据分组后对其进行转换。转换此数据的结果是它变得不那么精确-2018年4月1日之前有数千个日期,但您有效地将其转换为布尔值(在之前或之后)。所有日期为2018年3月29日、2018年3月28日等的行。。以前是唯一的,现在都变成了相同的值,因此出现了明显的重复


隐藏信息/以这种方式丢失精度会创建重复数据

是否可以发布一些示例数据WHERE子句中的表条件使左连接返回常规内部连接结果。将这些条件移动到ON子句以获得真正的左连接结果。(或者切换到内部联接?)我不认为
CompleteDate
数据类型是
DATE
,因为
'4/1/2018'
@sami如果CompleteDate是一个日期,sqlserver会将'4/1/2018'字符串转换为日期。您可以发布一些示例数据吗WHERE子句中的表条件使左联接返回常规的内部联接结果。将这些条件移动到ON子句以获得真正的左连接结果。(或者切换到内部连接?)我不认为
CompleteDate
数据类型是
DATE
,因为
'4/1/2018'
@sami如果CompleteDate是日期,sqlserver会将'4/1/2018'字符串转换为日期
select          case
                    when s.Customer is not null then 'Paid'
                else 'Free'
                end        as Paid_Free
                , Status
                , case
                      when CompleteDate < '4/1/2018' then '1H'
                  else '2H'
                  end      as Busy
                , count(*) userCount
from            CompletesCur OS
left outer join Sales        s on S.Cust = ID
where           s.ReturnYear = '2017'
and             MediaType = 'Online'
and             os.ReturnYearFiled = 2017
and             s.ReturnYear = s.TransactionTaxYear2
and             s.ProductGroup in ('Fed', 'State', 'Phone Support', 'Import')
group by        case
                    when s.Customer is not null then 'Paid'
                else 'Free'
                end
                , Status
                , case
                      when CompleteDate < '4/1/2018' then '1H'
                  else '2H'
                  end
select v.Paid_Free, Status, v.Busy, 
       count(*) as userCount
from CompletesCur OS left join
     Sales s
     on S.Cust = ID cross apply
     (values ( case when s.Customer is not null then 'Paid' else 'Free' END,
               case when CompleteDate < '2018-04-01' then '1H' else '2H' end
             )
     ) v(Paid_Free, Busy)
WHERE s.ReturnYear = '2017' and  -- is this really a string?
      MediaType = 'Online' and   -- what table is this from?
      os.ReturnYearFiled = 2017 and
      s.ReturnYear = s.TransactionTaxYear2 and
      s.ProductGroup in ('Fed', 'State', 'Phone Support', 'Import')
GROUP by v.Paid_Free, Status, v.Busy;
group by 
  case when s.Customer is not null then 'Paid' else 'Free' END,
  Status,
  case when CompleteDate < '4/1/2018' then '1H' else '2H' end
select 
   case when s.Customer is not null then 'Paid' else 'Free' END as Paid_Free,
   Status,
   case when CompleteDate < '4/1/2018' then '1H' else '2H' end as Busy, 
   --my additions
   s.customer,
   CompleteDate,
   count(*) userCount