限制列数的交叉表

2024-01-18 01:48
文章标签 限制 交叉 列数

本文主要是介绍限制列数的交叉表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




限制列数的交叉数据报表

--示例数据:
CREATE TABLE test(
factoryid varchar(20),
bagid int,
roll int,
number numeric(9,1),
UNIQUE(bagid,roll))
INSERT test SELECT 'M-CS-11#6/GREEN',1,1, 86
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,2, 59.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,3, 31.2
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,4, 42
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,5, 31
UNION ALL   SELECT 'M-CS-11#6/GREEN',1,6, 114.3

UNION ALL   SELECT 'M-CS-11#6/GREEN',2,7, 101
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,8, 83.9
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,9, 97.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',2,10,105.4

UNION ALL   SELECT 'M-CS-11#6/GREEN',3,11,103
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,12,128.5
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,13,74.7
UNION ALL   SELECT 'M-CS-11#6/GREEN',3,14,107

UNION ALL   SELECT 'M-CS-11#6/GREEN',4,15,73.4
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,16,100
UNION ALL   SELECT 'M-CS-11#6/GREEN',4,17,141.5
GO

问题描述:
    bagid,roll值唯一,需要将列roll水平显示,并且每条记录只显示4列,多余的自动换行。对于示例数据,要求结果如下(rolls是记录数):
factoryid                        bagid   rolls    n1      n2        n3        n4          Total  
---------------------------- --------- -------- -------- --------- --------- ---------- --------------
M-CS-11#6/GREEN   1         6          86.0    59.5     31.2     42.0    
M-CS-11#6/GREEN   1                     31.0    114.3                               364.0
M-CS-11#6/GREEN   2         4         101.0   83.9     97.5     105.4    387.8
M-CS-11#6/GREEN   3         4         103.0   128.5   74.7     107.0    413.2
M-CS-11#6/GREEN   4         3         73.4     100.0   141.5                  314.9
Total                                                                                                           1479.9

(所影响的行数为 6 行)

--查询处理代码
SELECT a.factoryid,a.bagid,
    rolls=CASE 
        WHEN a.roll=0 THEN CAST(b.rolls as varchar)
        ELSE '' END,
    a.n1,a.n2,a.n3,a.n4,
    Total=CASE
        WHEN a.roll IS NULL THEN CAST(a.Total as varchar)
        WHEN a.roll=(b.rolls-1)/4 THEN CAST(b.Total as varchar)
        ELSE '' END
FROM(
        SELECT factoryid=CASE 
                WHEN GROUPING(factoryid)=1 THEN 'Total'
                ELSE factoryid END,
            bagid=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(bagid AS VARCHAR) END,
            n1=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE CAST(SUM(CASE roll%4 WHEN 0 THEN number END) AS VARCHAR) END,
            n2=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 1 THEN number END) AS VARCHAR),'') END,
            n3=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 2 THEN number END) AS VARCHAR),'') END,
            n4=CASE
                WHEN GROUPING(factoryid)=1 THEN ''
                ELSE ISNULL(CAST(SUM(CASE roll%4 WHEN 3 THEN number END) AS VARCHAR),'') END,
            Total=SUM(number),
            roll=roll/4
        FROM(
            SELECT factoryid,bagid,number,
                roll=(SELECT COUNT(DISTINCT roll) 
                    FROM test 
                    WHERE factoryid=a.factoryid
                        AND bagid=a.bagid
                        AND roll
            FROM test a
        )a GROUP BY factoryid,bagid,roll/4 WITH ROLLUP
        HAVING GROUPING(factoryid)=1 OR GROUPING(roll/4)=0
    )a
    LEFT JOIN(
        SELECT factoryid,bagid,
            rolls=COUNT(*),
            Total=SUM(number)
        FROM test
        GROUP BY factoryid,bagid
    )b ON a.factoryid=b.factoryid
        AND a.bagid=b.bagid
GO


原帖地址




这篇关于限制列数的交叉表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/617784

相关文章

SpringBoot实现基于URL和IP的访问频率限制

《SpringBoot实现基于URL和IP的访问频率限制》在现代Web应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段,为了保护系统资源,需要对接口的访问频率进行限制,下面我们就来看看如何使用... 目录1. 引言2. 项目依赖3. 配置 Redis4. 创建拦截器5. 注册拦截器6. 创建控制器8.

Linux限制ip访问的解决方案

《Linux限制ip访问的解决方案》为了修复安全扫描中发现的漏洞,我们需要对某些服务设置访问限制,具体来说,就是要确保只有指定的内部IP地址能够访问这些服务,所以本文给大家介绍了Linux限制ip访问... 目录背景:解决方案:使用Firewalld防火墙规则验证方法深度了解防火墙逻辑应用场景与扩展背景:

如何提高Redis服务器的最大打开文件数限制

《如何提高Redis服务器的最大打开文件数限制》文章讨论了如何提高Redis服务器的最大打开文件数限制,以支持高并发服务,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录如何提高Redis服务器的最大打开文件数限制问题诊断解决步骤1. 修改系统级别的限制2. 为Redis进程特别设置限制

poj 2135 有流量限制的最小费用最大流

题意: 农场里有n块地,其中约翰的家在1号地,二n号地有个很大的仓库。 农场有M条道路(双向),道路i连接着ai号地和bi号地,长度为ci。 约翰希望按照从家里出发,经过若干块地后到达仓库,然后再返回家中的顺序带朋友参观。 如果要求往返不能经过同一条路两次,求参观路线总长度的最小值。 解析: 如果只考虑去或者回的情况,问题只不过是无向图中两点之间的最短路问题。 但是现在要去要回

poj 3422 有流量限制的最小费用流 反用求最大 + 拆点

题意: 给一个n*n(50 * 50) 的数字迷宫,从左上点开始走,走到右下点。 每次只能往右移一格,或者往下移一格。 每个格子,第一次到达时可以获得格子对应的数字作为奖励,再次到达则没有奖励。 问走k次这个迷宫,最大能获得多少奖励。 解析: 拆点,拿样例来说明: 3 2 1 2 3 0 2 1 1 4 2 3*3的数字迷宫,走两次最大能获得多少奖励。 将每个点拆成两个

poj 2195 bfs+有流量限制的最小费用流

题意: 给一张n * m(100 * 100)的图,图中” . " 代表空地, “ M ” 代表人, “ H ” 代表家。 现在,要你安排每个人从他所在的地方移动到家里,每移动一格的消耗是1,求最小的消耗。 人可以移动到家的那一格但是不进去。 解析: 先用bfs搞出每个M与每个H的距离。 然后就是网络流的建图过程了,先抽象出源点s和汇点t。 令源点与每个人相连,容量为1,费用为

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了

一些数学经验总结——关于将原一元二次函数增加一些限制条件后最优结果的对比(主要针对公平关切相关的建模)

1.没有分段的情况 原函数为一元二次凹函数(开口向下),如下: 因为要使得其存在正解,必须满足,那么。 上述函数的最优结果为:,。 对应的mathematica代码如下: Clear["Global`*"]f0[x_, a_, b_, c_, d_] := (a*x - b)*(d - c*x);(*(b c+a d)/(2 a c)*)Maximize[{f0[x, a, b,

Java应用对接pinpoint监控工具的时候,应用名称长度超出限制而导致接入失败

一、背景 java应用需要接入pinpoint,同一个虚拟机上的其他应用接入成功,唯独本应用不行。 首先排除是pinpoint agent的问题,因为其他应用都正常。 然后,我就对比二者的启动脚本。 -javaagent:/opt/pinpoint/pinpoint-bootstrap.jar -Dpinpoint.agentId=DA301004_17 -Dpinpoint.applic

apk反编译修改教程系列-----修改apk 解除软件限制功能 实例操作步骤解析_6【二十五】

目前很多软件都需要票票才可以使用完全的功能。纯免费的功能性app已经很少见了。 今天继续以一款app为大家来演示如何去除软件的限制功能。教程的目的主要是学习反编译的基础修改方法,了解app的修改步骤以及基础的入门修改常识。每个使用修改方法不一定适用于所有app。只是给你另外的思路与步骤参考。 反编译工具:MT**绿色版 演示apk;**清单 app