繁体   English   中英

如何从同一个表中选择多个别名列

[英]How to select multiple alias columns from the same table

我尝试了多种不同的解决方案,但我仍然没有从SQL Server查询中获得我想要的结果。 我有两个表, PRIMARY_CATEGORY有一个Category_Id作为PK和一个相关的Category_Name 有4个不同的类别。 另一个表是PRIMARY_SUBCATEGORY ,其具有Subcategory_Id (PK)Subcategory_NameCategory_Id作为PRIMARY_CATEGORY表的FK

我现在有一个select语句,它从一个大列中的Subcategory_Name返回整个列表,但我希望它将这些列分别为每个Category_Names的4个不同的列。 所以它应该是这样的(有〜显示省略的值7-49)

Column 1 | Column 2 | Column 3 | Column 4
Value A1 | Value B1 | Value C1 | Value D1
Value A2 | Value B2 | Value C2 | Value D2
Value A3 | Value B3 | Value C3 | Value D3
Value A4 | Value B4 | Value C4 | Value D4
Value A5 | Value B5 | Value C5 | Value D5
Value A6 | Value B6 | Value C6 | Value D6
   ~     |    ~     |     ~    |    ~ 
Value A50| Value B50| Value C50| Value D50

这就是我所拥有的,但是当我运行它时,我没有得到任何结果。 它按照我想要的方式格式化列。

SELECT 
    psc1.Subcategory_Name as 'Column 1',
    psc2.Subcategory_Name as 'Column 2',
    psc3.Subcategory_Name as 'Column 3',
    psc4.Subcategory_Name as 'Column 4'
FROM PRIMARY_CATEGORY pc
INNER JOIN PRIMARY_SUBCATEGORY psc1 ON psc1.Category_Id = pc.Category_Id
INNER JOIN PRIMARY_SUBCATEGORY psc2 ON psc2.Category_Id = pc.Category_Id
INNER JOIN PRIMARY_SUBCATEGORY psc3 ON psc3.Category_Id = pc.Category_Id
INNER JOIN PRIMARY_SUBCATEGORY psc4 ON psc4.Category_Id = pc.Category_Id    
WHERE 
    psc1.Category_Id IN (select Category_Id from PRIMARY_CATEGORY where Category_Name = 'Category 1')
    psc2.Category_Id IN (select Category_Id from PRIMARY_CATEGORY where Category_Name = 'Category 2')
    psc3.Category_Id IN (select Category_Id from PRIMARY_CATEGORY where Category_Name = 'Category 3')
    psc4.Category_Id IN (select Category_Id from PRIMARY_CATEGORY where Category_Name = 'Category 4')

我需要这么多内部连接才能做到这一点,还是只需一个就可以完成? 每列应基本上只显示与Category关联的Subcategory_Names。

我觉得这可能是一个过于复杂的查询来完成这个任务,但我不确定一个更好的方法来做到这一点。

运行什么雷达建议的MAX值,但没有组,我得到这样的东西

Column 1 | Column 2 | Column 3 | Column 4
Value A50 | Value A50 | Value C50 | Value D50

当我使用Subcategory_Id运行时,我得到了这个

Category_Id  | Column 1  | Column 2  | Column 3  | Column 4
           1 | [Blank]   | [Blank]   | Value C50 | [Blank]
           2 | [Blank]   | Value A50 | [Blank]   | [Blank]
           3 | [Blank]   | [Blank]   | [Blank]   | Value D50
           4 | Value A50 | [Blank]   | [Blank]   | [Blank]

你可以使用case based aggregation来获得它

您也可以使用pivot获得相同的结果

SELECT pc.category_id, 
       MAX(case when 
                pc.Category_Name ='Category 1'
                then psc.Subcategory_Name 
                else NULL end) as 'Column 1',
       MAX(case when 
                pc.Category_Name ='Category 2'
                then psc.Subcategory_Name 
                else NULL end) as 'Column 2',
       MAX(case when 
                pc.Category_Name ='Category 3'
                then psc.Subcategory_Name 
                else NULL end) as 'Column 3',
       MAX(case when 
                pc.Category_Name ='Category 4'
                then psc.Subcategory_Name 
                else NULL end) as 'Column 4',
FROM PRIMARY_CATEGORY pc
INNER JOIN PRIMARY_SUBCATEGORY psc ON pc.category_id = psc.category_id
GROUP BY pc.category_id

您可以使用pivot运算符获取所需的结果集,如下所示:

SELECT pivotedCataegories.[Category 1]
       , pivotedCataegories.[Category 2]
       , pivotedCataegories.[Category 3]
       , pivotedCataegories.[Category 4]
FROM (
    SELECT pc.Category_Name
        , ROW_NUMBER() OVER (PARTITION BY pc.Category_Id ORDER BY psc.Subcategory_Id) AS subCatNumber
        , psc.Subcategory_Name
    FROM PRIMARY_CATEGORY pc
    INNER JOIN PRIMARY_SUBCATEGORY  psc ON psc.Category_Id  = pc.Category_Id 
) AS categories
PIVOT (
    MAX(s.Subcategory_Name) 
    FOR s.Category_Name IN ([Category 1], [Category 2], [Category 3], [Category 4])
) pivotedCataegories

PIVOT运算符为s.Category_Name IN ([Categoasry 1], [Category 2], [Category 3], [Category 4])指定的每个值创建一个结果集s.Category_Name IN ([Categoasry 1], [Category 2], [Category 3], [Category 4])并为s.subCatNumber唯一值s.subCatNumber 每个类别列的值为MAX(s.Subcategory_Name) WHERE s.Category_Name = 'Category X' GROUP BY s.subCatNumber

此查询等效于

SELECT MAX(case when 
                categories.Category_Name = 'Category 1'
                then categories.catDesc 
                else NULL end) as 'Category 1',
       MAX(case when 
                categories.Category_Name = 'Category 2'
                then categories.Subcategory_Name 
                else NULL end) as [Category 2],
       MAX(case when 
                categories.Category_Name = 'Category 3'
                then categories.Subcategory_Name 
                else NULL end) as [Category 3],
       MAX(case when 
                categories.Category_Name = 'Category 4'
                then categories.Subcategory_Name 
                else NULL end) as [Category 4]
FROM (
     SELECT pc.Category_Name
            , ROW_NUMBER() OVER (PARTITION BY pc.Category_Id ORDER BY psc.Subcategory_Id) AS subCatNumber
            , psc.Subcategory_Name
    FROM PRIMARY_CATEGORY pc
    INNER JOIN PRIMARY_SUBCATEGORY  psc ON psc.Category_Id  = pc.Category_Id 
) categories
GROUP BY subCatNumber

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM