SQL-CASE WHEN语句,未完全工作

SQL-CASE WHEN语句,未完全工作,sql,sql-server,Sql,Sql Server,大家早上好 首先,我对SQL非常陌生,我还处于学习阶段 我对我认为是一个简单的“CASE-WHEN”陈述感到非常沮丧 我目前正在尝试将一个位置的所有不同属性类型拉成是或否(空白字段)格式 附加的SQL图表窗格、条件窗格、SQL窗格和结果的屏幕截图 SQL代码: SELECT DISTINCT TOP (100) PERCENT dbo.ih_location.place_ref, dbo.co_place.address##1, dbo.co

大家早上好

首先,我对SQL非常陌生,我还处于学习阶段

我对我认为是一个简单的“CASE-WHEN”陈述感到非常沮丧

我目前正在尝试将一个位置的所有不同属性类型拉成是或否(空白字段)格式

附加的SQL图表窗格、条件窗格、SQL窗格和结果的屏幕截图

SQL代码:

SELECT DISTINCT 
                         TOP (100) PERCENT dbo.ih_location.place_ref, dbo.co_place.address##1, dbo.co_place.address##2, dbo.ih_location.location_type, 

CASE WHEN (dbo.ih_loc_attr.attrib_code = '10%T') THEN 'Yes' ELSE '' END AS [10%T], 
CASE WHEN (dbo.ih_loc_attr.attrib_code = 'EPCB') THEN 'Yes' ELSE '' END AS EPCB, CASE WHEN (dbo.ih_loc_attr.attrib_code = 'GR1') THEN 'Yes' ELSE '' END AS GR1, 
CASE WHEN (dbo.ih_loc_attr.attrib_code = 'SAP') THEN 'Yes' ELSE '' END AS SAP, CASE WHEN (dbo.ih_loc_attr.attrib_code = 'SOCH') THEN 'Yes' ELSE '' END AS SOCH, dbo.ih_loc_attr.attrib_code

FROM          
  dbo.co_place LEFT OUTER JOIN
                         dbo.ih_loc_attr ON dbo.co_place.place_ref = dbo.ih_loc_attr.place_ref RIGHT OUTER JOIN
                         dbo.ih_location ON dbo.co_place.place_ref = dbo.ih_location.place_ref

WHERE       
(dbo.ih_location.place_ref = '00010001')

ORDER BY
dbo.ih_location.place_ref
正如您将看到的,我在6行中显示了这一点。理想情况下,我希望它显示在一行,但在不同的列标题

我希望我所说的有道理

这方面的任何帮助都将是惊人的

非常感谢 Stewart使用聚合:

SELECT l.place_ref, p.address##1, p.address##2, l.location_type, 
       MAX(CASE WHEN la.attrib_code = '10%T' THEN 'Yes' END) AS [10%T], 
       MAX(CASE WHEN la.attrib_code = 'EPCB' THEN 'Yes' END) AS EPCB,
       MAX(CASE WHEN la.attrib_code = 'GR1' THEN 'Yes' END) AS GR1, 
       MAX(CASE WHEN la.attrib_code = 'SAP' THEN 'Yes' END) AS SAP,
       MAX(CASE WHEN la.attrib_code = 'SOCH' THEN 'Yes' END) AS SOCH    
FROM dbo.co_place p LEFT OUTER JOIN
     dbo.ih_loc_attr la
     ON p.place_ref =ila.place_ref RIGHT OUTER JOIN
     dbo.ih_location l
     ON p.place_ref = l.place_ref
WHERE l.place_ref = '00010001'
GROUP BY l.place_ref, p.address##1, p.address##2, l.location_type;
注:

  • 使用表别名,可以使查询更易于编写和读取
  • 我不建议使用
    右外部联接
    ,但我没有修复查询的这一部分
  • ELSE'
    是不必要的。只需使用
    NULL
    值,让聚合处理逻辑
  • 我不确定
    分组依据中的其他列是否合适
使用聚合:

SELECT l.place_ref, p.address##1, p.address##2, l.location_type, 
       MAX(CASE WHEN la.attrib_code = '10%T' THEN 'Yes' END) AS [10%T], 
       MAX(CASE WHEN la.attrib_code = 'EPCB' THEN 'Yes' END) AS EPCB,
       MAX(CASE WHEN la.attrib_code = 'GR1' THEN 'Yes' END) AS GR1, 
       MAX(CASE WHEN la.attrib_code = 'SAP' THEN 'Yes' END) AS SAP,
       MAX(CASE WHEN la.attrib_code = 'SOCH' THEN 'Yes' END) AS SOCH    
FROM dbo.co_place p LEFT OUTER JOIN
     dbo.ih_loc_attr la
     ON p.place_ref =ila.place_ref RIGHT OUTER JOIN
     dbo.ih_location l
     ON p.place_ref = l.place_ref
WHERE l.place_ref = '00010001'
GROUP BY l.place_ref, p.address##1, p.address##2, l.location_type;
注:

  • 使用表别名,可以使查询更易于编写和读取
  • 我不建议使用
    右外部联接
    ,但我没有修复查询的这一部分
  • ELSE'
    是不必要的。只需使用
    NULL
    值,让聚合处理逻辑
  • 我不确定
    分组依据中的其他列是否合适

您确定正在使用MySQL吗?该查询看起来更像SQL Server。很抱歉,我现在已经对其进行了修改。我认为您需要继续使用您的查询,“越短越好”并不总是这样。您确定要使用MySQL吗?该查询看起来更像SQL Server。很抱歉,我现在已经对其进行了修改。我认为您需要继续使用您的查询,“越短越好”并不总是最合适的情况。显然,OP有一对多的关系,他们希望查询“自动”聚合他们的数据快来吧,戈丹。显然,OP有一对多的关系,他们希望查询“自动”聚合他们的数据