0

我正在尝试做一个Join

来自具有产品信息的 Items 表,如ItemID、UpcCode、Facing、ItemNameArabic、ShelfCapacity,SERVICETYPE之外的所有内容

加入具有UpcCodeServiceType的表Schedule 。

正如您在图片中看到的,几乎相同的数据有两行,除了一个声明ServiceTypeVMFSRR

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

要么就像 2 列 [布尔列]

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

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

或者

一列[服务类型]

它在哪里检查它是否有 SRR,只有 SRR 出现,否则 Vmf 出现

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

谢谢你

在此处输入图像描述

4

3 回答 3

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

我要感谢@nestor链接的精彩回答

于 2013-01-28T11:04:54.350 回答
1

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

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

如果您想为每个项目名称获得 1 行,您有两种选择:

  1. 从查询中删除不同的列。
  2. 列表项将所有不同的数据透视到列。
于 2013-01-28T10:15:05.907 回答
0

我想你可以尝试使用 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语句会获取你的多行,但我认为如果你想将行转换为列,假设你提到的只有2行'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;
于 2013-01-28T07:41:13.297 回答