SQL Server Select Case语句,在两列中具有两个不同的值

时间:2013-01-28 07:25:00

标签: sql sql-server sql-server-2008

我正在尝试 加入

来自 项目表 ,其中包含产品信息 ItemID,UpcCode,Facing,ItemNameArabic,ShelfCapacity SERVICETYPE

之外的所有内容

加入计划& 的ServiceType。

正如您在图片中看到的那样,对于几乎相同的数据,有两行,除了一行说明 ServiceType VMF SRR

我想要的是行数应该减少。如果你参考图片。 NESCAFE GOLD 50G 重复两次。一次用于VMF& SRR。我只想通过使用下面的任何一种方法出现一次

它就像2列[布尔列]

a)VMF列[如果值为VMF则为'是'或否则'否']

b)SRR栏[如果值为SRR则为'是'或否则'否']

一列[ ServiceType ]

如果它检查是否有SRR,则只显示SRR,否则显示Vmf

在任何上述期望的结果中,将减少我的行数

谢谢

enter image description here

3 个答案:

答案 0 :(得分:1)

通过仅处理 ServiceType 列,每个 ItemName 不会获得1行。

查看附件:您在其他列中有不同的数据,例如面对 ShelfCapacity

如果您希望每个项目名称获得1行,则有两个选项:

  1. 从查询中删除不同的列。
  2. 列出项目枢轴全部您的 不同的数据到列。

答案 1 :(得分:1)

SELECT  case when vmf is null then 0 else 1 end as vmf, 
case when srr is null then 0 else 1 end as srr, 
UpcCode,date, StoreID
FROM
(SELECT itemid,items.UpcCode, ServiceType, date, ROW_NUMBER() OVER (ORDER BY servicetype) AS ROWNUMBER, s.ID as StoreID
           FROM Items join Schedule on Items.upccode= schedule.upccode
) r
PIVOT
(
max (r.rownumber)
FOR r.servicetype IN( [vmf],[srr])
) AS pvt

我要感谢@nestorlink

的精彩回答

答案 2 :(得分:0)

我认为你可以尝试使用Case Statement

更改Select语句中的ServiceType
   SELECT  ItemId,....., ServiceType =
          CASE ServiceTypes
             WHEN 'VMF' THEN 'True'
             WHEN 'SRR' THEN 'False'
             ELSE ''
          END, InLimit, IpConcantenated
        from ....
        where ...

如果您想要重复该列,请使用两次

   SELECT  ItemId,.....,
          ServiceTypeVMF =
          CASE ServiceType
             WHEN 'VMF' THEN 'True'
             WHEN 'SRR' THEN 'False'
             ELSE ''
          END, 
          ServiceTypeSRR =
          CASE ServiceType
             WHEN 'VMF' THEN 'False'
             WHEN 'SRR' THEN 'True'
             ELSE ''
          END, 
          InLimit,
          IpConcantenated
        from ....
        where ...

以前的case语句会获取多行,但我认为如果你想将行转换为列,那么应该是你的sql语句,假设你提到的只有2行'VMF'和'SNR'< / p>

with cte as
(select ItemID, Upccode, ..............,
  row_number() over(partition by ItemID, Upccode order by ServiceType) As rn
  ,ServiceType
  ,MinLimit
  ,IsContracted     
from Items)
select ItemID, UpcCode, 
  max(case when rn = 1 then ServiceType end) as ServiceType1,
  max(case when rn = 2 then ServiceType end) as ServiceType2,
  ,MinLimit
  ,IsContracted     
from cte
group by ItemId, UpcCode,.........,MinLimit,IsContracted;