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

SQL Server Select Case语句,在两列中有两个不同的值,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正在尝试加入 从包含以下产品信息的项目表中 ItemID、UpcCode、Facing、ItemNameArabic、ShelfCapacity除服务类型外的所有内容 正在加入表计划,该计划包含UpcCode和ServiceType 如图所示,除了一行表示服务类型(要么VMF要么SRR),几乎相同的数据有两行 我想要的是行数应该减少。如果你参考图片。 雀巢黄金50G重复两次。一次用于VMF和SRR。我只想使用下面的任何一种方法显示一次 要么像2列[布尔列] a) VMF列[如果值为VMF,则为

我正在尝试加入

从包含以下产品信息的项目表中 ItemID、UpcCode、Facing、ItemNameArabic、ShelfCapacity除服务类型外的所有内容

正在加入表计划,该计划包含UpcCode和ServiceType

如图所示,除了一行表示服务类型(要么VMF要么SRR),几乎相同的数据有两行

我想要的是行数应该减少。如果你参考图片。 雀巢黄金50G重复两次。一次用于VMF和SRR。我只想使用下面的任何一种方法显示一次

要么像2列[布尔列]

a) VMF列[如果值为VMF,则为“是”或“否”]

b) SRR列[如果值为SRR,则为“是”或“否”]

一列[ServiceType]

在这里,它检查是否只有SRR出现,或者Vmf出现

在上述任何一种情况下,期望的结果都会减少我的行数

多谢各位


我认为您应该尝试使用Case语句更改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语句将获取多行,但我认为如果您想将行转换为列,假设只有两行“VMF”和“SNR”,那么这就是您的sql语句

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;

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

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

如果要为每个项目名称获取一行,则有两个选项:

  • 从查询中删除不同的列
  • 列出项目透视图所有项目 将不同的数据添加到列中

  • 我想感谢你在

    上的精彩回答,我想你似乎已经有了一栏的方法。如果你在servicetype=“VMF”中添加where子句,你可能会过滤掉VMF并用“SRR”进行交换。我尝试过这种方法。同样的事情也发生了。InLimit&ipConcatenateDwell InLimit,IPConcatenated是我在你的图片中看到的列,它们遵循我从你的图片中看到的服务类型。所以它是Select,ServiceType列。。这就是InLimit和IPConcatenated的内容。。我认为这是最低限度的,是有合同的。。糟糕,我只是假设你的是一个路由数据库,因为我们经常在路由数据库中遇到这些列。。无论如何,我不知道这是否是我的浏览器,但是你发布的图像在我的终端上没有很好的分辨率。谢谢你的快速回复。重复该列。它仍然给我2行相同的产品。我只想要一排。ServiceTypeVMF(真)、ServiceTypeSRR(假)well select distinct可以工作,但我认为问题不止于此。问题似乎出在您编写的联接中,而不是服务类型中。。因此,我认为您应该再次查看select查询,它返回的是2行而不是1行,然后可能会包含Case语句以切换到boolean。我的错,select distinct不起作用。。你说了几乎相同的数据,你没有说相同的数据。。但我确实认为您的问题源于您编写的最初的select和join,我认为如果您发布join语句和表结构,您可以得到更好的帮助—有人可能能够对其进行故障排除。。但是现在我想我更了解这个问题了。。u hv servicetype记录在行中,而您希望在列中显示它们。是的,我已经实现了。谢谢,我已经发布了我的答案。
    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