sql - 选择返回动态列

标签 sql sql-server view

我有两个表:标准和服务产品。一个标准可以有多个服务产品。每个标准可以有不同数量的与其关联的服务产品。

我需要做的是编写一个 View ,该 View 将返回一些常见数据,然后在一行上列出服务产品。例如:

Standard Id | Description | SO #1 | SO #2 | SO #3 | ... | SO #21 | SO Count
1           | One         | A     | B     | C     | ... | G      |  21
2           | Two         | A     |       |       | ... |        |  1
3           | Three       | B     | D     | E     | ... |        |  3

我不知道如何写这个。 SO 列的数量设置为特定数量(本例中为 21),因此我们不能超过该数量。

关于如何解决这个问题有什么想法吗?

我开始的地方如下。当每个服务产品需要位于一行时,它只是返回多行。

SELECT *
  FROM SERVICE_OFFERINGS
 WHERE STANDARD_KEY IN (SELECT STANDARD_KEY
                          FROM STANDARDS)

其他 SQL

所以这是我的 SQL,它返回我想要的所有内容,但由于有 11 个服务产品,因此将返回 11 行。我一直在尝试数据透视表,但似乎无法弄清楚这一点。有人可以帮忙提供一个代码示例吗?

SELECT DISTINCT stpc.standard_key,
                stpc.test_id,
                NULL AS pricebook_id,
                stpc.stabdard_name AS description,
                stpc.date_start AS begin_date,
                stpc.date_end AS end_date,
                sopd.service_offering_id
  FROM STANDARDS stpc,
       SERVICE_OFFERINGS sopd
 WHERE 1=1
   AND sopd.standard_key = stpc.standard_key
 ORDER BY stpc.standard_key, sopd.service_offering_id

更新

由于数据库不支持 PIVOT 表(并且无法找出 XML 建议),因此我必须执行一些棘手的 SQL 才能使其正常工作。这是我使用的:

select stpc.oracle_product_code AS test_id,
       CASE WHEN stpc.store_key = 200 THEN 'CE_USAUSD09'
            WHEN stpc.store_key = 210 THEN 'CE_CANCAD09' END AS pricebook_id,
       stpc.standard_name AS its_test_desc,
       CONVERT(VARCHAR(10), stpc.date_start, 101) AS begin_date,
       CONVERT(VARCHAR(10), stpc.date_end, 101) AS end_date,
       MAX(CASE WHEN rn = 1 THEN b.service_offering_id END) AS SERVICE_OFFERING_1,
       MAX(CASE WHEN rn = 2 THEN b.service_offering_id END) AS SERVICE_OFFERING_2,
       MAX(CASE WHEN rn = 3 THEN b.service_offering_id END) AS SERVICE_OFFERING_3,
       MAX(CASE WHEN rn = 4 THEN b.service_offering_id END) AS SERVICE_OFFERING_4,
       MAX(CASE WHEN rn = 5 THEN b.service_offering_id END) AS SERVICE_OFFERING_5,
       MAX(CASE WHEN rn = 6 THEN b.service_offering_id END) AS SERVICE_OFFERING_6,
       MAX(CASE WHEN rn = 7 THEN b.service_offering_id END) AS SERVICE_OFFERING_7,
       MAX(CASE WHEN rn = 8 THEN b.service_offering_id END) AS SERVICE_OFFERING_8,
       MAX(CASE WHEN rn = 9 THEN b.service_offering_id END) AS SERVICE_OFFERING_9,
       MAX(CASE WHEN rn = 10 THEN b.service_offering_id END) AS SERVICE_OFFERING_10,
       MAX(CASE WHEN rn = 11 THEN b.service_offering_id END) AS SERVICE_OFFERING_11,
       MAX(CASE WHEN rn = 12 THEN b.service_offering_id END) AS SERVICE_OFFERING_12,
       MAX(CASE WHEN rn = 13 THEN b.service_offering_id END) AS SERVICE_OFFERING_13,
       MAX(CASE WHEN rn = 14 THEN b.service_offering_id END) AS SERVICE_OFFERING_14,
       MAX(CASE WHEN rn = 15 THEN b.service_offering_id END) AS SERVICE_OFFERING_15,
       MAX(CASE WHEN rn = 16 THEN b.service_offering_id END) AS SERVICE_OFFERING_16,
       MAX(CASE WHEN rn = 17 THEN b.service_offering_id END) AS SERVICE_OFFERING_17,
       MAX(CASE WHEN rn = 18 THEN b.service_offering_id END) AS SERVICE_OFFERING_18,
       MAX(CASE WHEN rn = 19 THEN b.service_offering_id END) AS SERVICE_OFFERING_19,
       MAX(CASE WHEN rn = 20 THEN b.service_offering_id END) AS SERVICE_OFFERING_20,
       MAX(CASE WHEN rn = 21 THEN b.service_offering_id END) AS SERVICE_OFFERING_21,
       MAX(rn) AS service_offering_count
FROM (
select standard_key,
       service_offering_id, 
       row_number() over (partition by standard_key order by standard_key) rn
from SERVICE_OFFERINGS
) B,
SERVICE_OFFERINGS sopd,
STANDARDS stpc
where b.service_offering_id = sopd.service_offering_id
AND b.standard_key = stpc.standard_key
AND sopd.standard_key = stpc.standard_key
AND stpc.store_key IN (200,210)
AND stpc.create_date > '03/29/2010'
group by stpc.oracle_product_code,stpc.store_key,stpc.standard_name,stpc.date_start,stpc.date_end

最佳答案

您可以使用 PIVOT 功能来实现此目的。

查看 http://archive.msdn.microsoft.com/SQLExamples/Wiki/View.aspx?title=PIVOTData

您应该使用 FOR XML 和 SplitToColumns 的组合,而不是 PIVOT。

使用FOR XML并将您的产品转向单列 Concatenating Row Values in Transact-SQL

然后使用 CTE 样式函数将单个单元格分解为列,如下所示 http://www.sqlservercentral.com/articles/CTE/67974/

这将为您提供一张以您需要的方式向外旋转的 table 。

然后进行算术来获取非空列的计数,最后就得到了所需的计数。

关于sql - 选择返回动态列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2729650/

相关文章:

sql - 正则表达式匹配常见的 SQL 语法?

sql - 按低于某个值的所有日期降序排序,然后按高于该值的所有日期升序排序

sql-server - 在 SQL Server 中存储和检索 Active Directory 对象 GUID

swift - 在 mapView 中搜索特定的注释

css - jqgrid-向长 View 模型添加滚动条

php - 如何订购两个日期列并从 mariadb 的一个表中获取最新的 20 条记录?

SQL WHERE AND 错误消息

ruby-on-rails - 助手没有显示任何内容

php - CakePHP-DateTime 和 php 的 date()

sql-server - 退出单用户模式