Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何从同一个表中选择多个alias列_Sql_Sql Server - Fatal编程技术网

Sql 如何从同一个表中选择多个alias列

Sql 如何从同一个表中选择多个alias列,sql,sql-server,Sql,Sql Server,我已经尝试了多种不同的解决方案,但仍然没有从我的SQL Server查询中得到想要的结果。我有两个表,PRIMARY\u CATEGORY,每个表都有一个CATEGORY\u Id作为PK和一个相关的CATEGORY\u名称。有4个不同的类别。另一个表是PRIMARY_SUBCATEGORY,它具有SUBCATEGORY_Id(PK)、SUBCATEGORY_Name,并且Category_Id作为FK到PRIMARY_Category表 我现在有一个select语句,它在一个大列中返回子类别名

我已经尝试了多种不同的解决方案,但仍然没有从我的
SQL Server
查询中得到想要的结果。我有两个表,
PRIMARY\u CATEGORY
,每个表都有一个
CATEGORY\u Id
作为PK和一个相关的
CATEGORY\u名称。有4个不同的类别。另一个表是
PRIMARY_SUBCATEGORY
,它具有
SUBCATEGORY_Id
(PK)
SUBCATEGORY_Name
,并且
Category_Id
作为FK
PRIMARY_Category

我现在有一个select语句,它在一个大列中返回
子类别名称
的整个列表,但我希望它将每个类别名称分成4个不同的列。所以它应该是这样的(用~表示省略的值7-49)

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

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')
我需要这么多的内部连接来完成这项工作,还是只需要一个就可以完成?每列基本上只应显示与类别关联的子类别名称

我觉得要完成这项任务,这可能是一个过于复杂的查询,但我不确定是否有更好的方法

运行雷达建议的最大值,但没有group by,我得到了类似的结果

Column 1 | Column 2 | Column 3 | Column 4
Value A50 | Value A50 | Value C50 | Value D50
当我使用
子类别\u 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]

您可以使用
基于案例的聚合

您也可以使用
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操作符创建一个结果集,其中([Categoasry 1]、[Category 2]、[Category 3]、[Category 4])中的
s.Category\u名称指定的每个值有一列,
s.subCatNumber
的唯一值有一行。每个类别列的值为
MAX(s.Subcategory\u Name),其中s.category\u Name='category X'按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

看一看。我使用了这个查询,但是删除了MAX和GROUP BY,因为我想返回每个类别的所有值,尽管现在我遇到了一个新问题。执行此操作后,如何从结果中删除所有空值?如果我尝试将整个内容包装在一个
中,选择*FROM()作为结果,然后执行
WHERE IS NOT NULL
,但一次只对一列有效。如何返回没有空值或空值的所有字段?@Shintsu,我们正在使用MAX将行转换为列,它将重新返回所有类别,并将类别id添加到select,请参见编辑。我已更新了问题,以显示在运行您发布的原始查询和此更新查询时得到的结果。
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